php中 ,一直以来,服务端搜索,我都是写一堆条件判断,搜索条件少时还好,条件一多,就显的代码有点丑陋了;

看着非常不舒服。今天在园子里看到一篇文章(http://www.cnblogs.com/xqin/archive/2013/06/03/3114634.html)。

不过,他是用NET写的。但受了这篇文章一点启发。将我的搜索改了下,虽然现在看起来还不是很完美。但代码看起来没那么丑了。

$data = array();
$data = fixer::input('post')
->specialChars('username,nickname,regdate_startDate,regdate_endDate')
->get();

$searchSetting = array(
array('field'=>'username' , 'cp'=> 'like'),
array('field'=>'nickname' , 'cp'=> 'like'),
array('field'=>'regdate' , 'cp'=> 'daterange'),
);

$map = service('Search')->loadSearchSettings($searchSetting , $data);

上面代码是先将客户端提交的数据,先整理好。包括转义和类型转换。因为搜索那边,是不处理数据的。数据是在外围处理好的

$searchSetting  这个数组存的是每个搜索的配置 ,其它 cp 的值就是我们需要写的.我目前只写了 equal ,like ,daterange.刚好用到了这几个。

这样执行后,在控制器里的代码很少,看上去没那么乱,直接将$map做为where条件

class SearchService
{

/** $searchSetting = array(
array('field'=>'username' , 'cp'=> 'like','variable'=>'uname'),
);
* 根椐传递过来的动态搜索配置,生成相应的查询条件,返回去
* @param array $searchSettings [description]
* @return [type] [description]
*/
public function loadSearchSettings($searchSettings = array() , $data)
{
$map = array();
if (empty($searchSettings) || ! is_array($searchSettings)) return $map;
foreach ($searchSettings as $item)
{
$cp = isset($item['cp']) && $item['cp'] ? trim($item['cp']) : '';
if (empty($cp)) continue;
if(method_exists('cp' , $cp)) {
$s = call_user_func_array(array('cp' , $cp) , array($item , $data) );
if ($s) $map[] = $s;
}
}

$whereData = array();
if ($map)
{
foreach($map as $key => $item)
{
if (is_array($item))
{
foreach($item as $field => $value)
{
$whereData[$field] = $value;
}
}
}
}

return $whereData;
}

}

cp.php类

<?php
/**
* 搜索的各种逻辑
* 注意,不处理数据,数据在外围处理好,包括类型转换这种
* @package framework
*/
class cp
{
const FIELD_NAME = 'field';
const VARIABLE = 'variable';

/**
* 相等
* @param [type] $fieldConfig [description]
* @param array $data [description]
* @return [type] [description]
*/
public static function equal($fieldConfig ,$data = array())
{
$map = array();

if (! isset($fieldConfig[self::FIELD_NAME])) return $map;
$fieldName = $fieldConfig[self::FIELD_NAME];
$getfield = self::getField($fieldConfig);
if (isset($data[$getfield]) && $data[$getfield])
{
$map[$fieldName] = $data[$getfield];
}
return $map;
}

/**
* like查询
* @param [type] $fieldConfig [description]
* @param array $data [description]
* @return [type] [description]
*/
public static function like($fieldConfig ,$data = array())
{
$map = array();
import('ORG.Util.Input');

if (! isset($fieldConfig[self::FIELD_NAME])) return $map;
$fieldName = $fieldConfig[self::FIELD_NAME];
$getfield = self::getField($fieldConfig);
if (isset($data[$getfield]) && $data[$getfield])
{
$map[$fieldName] = array('like' , Input::forSearch($data[$getfield]));
}
return $map;
}

/**
* like查询
* @param [type] $fieldConfig [description]
* @param array $data [description]
* @return [type] [description]
*/
public static function daterange($fieldConfig ,$data = array())
{
$map = array();

if (! isset($fieldConfig[self::FIELD_NAME])) return $map;
$fieldName = $fieldConfig[self::FIELD_NAME];
$getfield = self::getField($fieldConfig);

if (isset($data[$getfield.'_start']) && $data[$getfield.'_start'])
{
$map[$getfield][] = array('EGT' , strtotime($data[$getfield.'_start']));
}
if (isset($data[$getfield.'_end']) && $data[$getfield.'_end'])
{
$map[$getfield][] = array('ELT' , strtotime($data[$getfield.'_end']));
}

return $map;
}

/**
* 获取字段名称
* @param [type] $fieldConfig [description]
* @return [type] [description]
*/
private function getField($fieldConfig)
{
$field = self::FIELD_NAME;
if (isset($fieldConfig[self::VARIABLE]))
{
$field = self::VARIABLE;
}

return $fieldConfig[$field];
}

}

这样就把以前的逻辑,全放到cp.php这个类里面来了。要加什么规则,直接在这个类里面加上就行了。

虽说不是很高深的,但适合就行了。

php服务端搜索,功能改进的更多相关文章

  1. Bootstrap插件系列——Bootstrap-table初始化、分页、客户端搜索、服务端搜索

    又好久不写博客,最近项目都是用的bootstrap的样式,不出意外,应该是要在bootstrap的道路上越走越远了,所以下定决心,把bootstrap的插件都好好学学. 昨天写了boostrap-ta ...

  2. Vue.js与 ASP.NET Core 服务端渲染功能整合

    http://mgyongyosi.com/2016/Vuejs-server-side-rendering-with-aspnet-core/ 原作者:Mihály Gyöngyösi 译者:oop ...

  3. SuperWebSocket实现服务端和WebSocket4Net实现客户端

    SuperWebSocket实现服务端和WebSocket4Net实现客户端具体实现如下: SuperWebSocket实现服务端 注:本作者是基于vs2019 enterprise版本,所有项目均为 ...

  4. WebSocket——SuperWebSocket实现服务端和客户端

    WebSocket——SuperWebSocket实现服务端和客户端具体实现如下: 注:本作者是基于vs2019 enterprise版本,所有项目均为.Net Framwork4.7版本(因为Web ...

  5. 服务端事件EventSource揭秘

    服务端推 服务端推,指的是由服务器主动的向客户端发送消息(响应).在应用层的HTTP协议实现中,"请求-响应"是一个round trip,它的起点来自客户端,因此在应用层之上无法实 ...

  6. ASP.NET Core 与 Vue.js 服务端渲染

    http://mgyongyosi.com/2016/Vuejs-server-side-rendering-with-aspnet-core/ 原作者:Mihály Gyöngyösi 译者:oop ...

  7. Headless Chrome:服务端渲染JS站点的一个方案【上篇】【翻译】

    原文链接:https://developers.google.com/web/tools/puppeteer/articles/ssr 注:由于英文水平有限,没有逐字翻译,可以选择直接阅读原文 tip ...

  8. 实现PHP服务端和c#客户端数据交换

    服务端实现功能1,数据库的访问dbhelper.php包括执行语句返回多行,返回json数据,返回单条记录,返回第一行第一列的整数,返回第一行第一列的浮点数,返回第一行第一列的双精度数,返回第一行第一 ...

  9. Linux下用gSOAP开发Web Service服务端和客户端程序

    网上本有一篇流传甚广的C版本的,我参考来实现,发现有不少问题,现在根据自己的开发经验将其修改,使用无误:另外,补充同样功能的C++版本,我想这个应该更有用,因为能用C++,当然好过受限于C. 1.gS ...

随机推荐

  1. Python环境安装与基础语法(2)——数据类型、标识符、语言分类

    高级语言发展 结构化语言:以顺序(步骤化),分支,循环描述问题 面向对象语言:接近人类的认知,万物抽象成对象,对象间的关系抽象成类和继承 程序=数据结果+算法 Python解释器 CPython:由C ...

  2. 函数arguments讲解

         // 总结:1- 函数内部有一个实参 arguments 可以获取所有的实参.      //2- arguments是一个伪数组,如果要使用数组的方法, 将它转为真数组      // 3 ...

  3. 为什么tcp的TIME_WAIT状态要维持2MSL

    本文主要分析为什么TIME_WAIT状态的持续时间是2MSL而不是1MSL,3MSL或其它的时长,而不会详细描述为什么需要TIME_WAIT状态. 阅读本文需要的预备知识: 了解TCP协议的状态变迁: ...

  4. adb连接夜神模拟器与adb常用操作命令

    adb connect 127.0.0.1:62001 adb kill-server 在关闭adb服务后,要使用如下的命令启动adb服务. adb start-servermore than one ...

  5. C++面向对象程序设计学习笔记(2)

    C++在非面向对象方面的扩充 C++向下兼容C语言,因此C语言中的语法在C++中依然成立 输入输出 C++添加了标准输入流对象cin和标准输出流对象cout来进行输入输出, 例: #include&l ...

  6. 关于const关键字

    const:ES6新增关键字,用于声明创建一个值的只读引用. 我们都知道,const一般用来定义常量,在声明的时候需要赋初始值,而且初始值一旦赋值,便不能改变. 但是以上说的是针对于基本类型数据的定义 ...

  7. 【Step-By-Step】第 三 周

    本周面试题一览: 什么是XSS攻击,XSS 攻击可以分为哪几类?我们如何防范XSS攻击? 如何隐藏页面中的某个元素? 浏览器事件代理机制的原理是什么? setTimeout 倒计时为什么会出现误差? ...

  8. [学习笔记] 网络最大流的HLPP算法

    #define \(u\)的伴点集合 与\(u\)相隔一条边的且\(u\)能达到的点的集合 \(0x00~ {}~Preface\) \(HLPP(Highest~Label~Preflow~Push ...

  9. MySQL实战45讲学习笔记:第十七讲

    一 .引子 我在上一篇文章,为你讲解完 order by 语句的几种执行模式后,就想到了之前一个做英语学习 App 的朋友碰到过的一个性能问题.今天这篇文章,我就从这个性能问题说起,和你说说 MySQ ...

  10. [LeetCode] 390. Elimination Game 淘汰游戏

    There is a list of sorted integers from 1 to n. Starting from left to right, remove the first number ...