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. HDU4815 Little Tiger vs. Deep Monkey——0-1背包

    题目描述 对于n道题目,每道题目有一个分值,答对加分,答错不得分,你要和一个叫深猴的比赛,题目你可以假设成判断题(不是对就是错),深猴对于所有的题目都是随机选择一个答案,而你是有脑子的,求为了不输掉比 ...

  2. pdfium去掉v8支持

    GYP_DEFINES='pdf_enable_v8=0 pdf_enable_xfa=0' build/gyp_pdfium 未测试  ???????????

  3. IIS网站应用偶尔出现"服务不可用"或者显示乱码字体

    IIS网站应用偶尔出现"服务不可用"或者显示乱码字体,使用以下办法可以解决. 原因:此种情况常会出现在iis是在Visual Studio或者.NET Framework之后安装发 ...

  4. (转)LoadRunner集合点设置1

    集合点的意思时等到特定的用户数后再一起执行某个操作,比如一起保存,一起提交(我们通常意义上的并发数并不是指一起提交或者一起保存),一般情况下使用不到集合点,不过,订票系统或者促销类需要用到,比如说某个 ...

  5. Linux安装Gitlab服务器

    1. 下载GitLab 下载地址:https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-10.8.2-ce.0.el ...

  6. npm安装使用^符号时,在0.0.1等版本下区别

    文档地址 https://docs.npmjs.com/misc/semver Caret Ranges ^1.2.3 ^0.2.5 ^0.0.4§ Allows changes that do no ...

  7. 用 mongodb + elasticsearch 实现中文检索

      而 elasticsearch 可以很好的支持各种语言的全文检索,但我们暂时又不想切换到 elasticsearch 作为后端数据库. 当然,可以在 web 应用中存储数据的时候,再主动写一份到 ...

  8. Aliyun STS Java SDK示例

    package com.aliyun.oss.demo; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.exceptions.Cl ...

  9. Visualforce 页面的生命周期

    了解 Visualforce 页面的生命周期可以让我们明白其各个元素的执行顺序.改变逻辑,从而提高开发效率,避免不必要的错误. 在官方文档中有详细的讲解.本文摘取其中的要点,作为一个总结. Visua ...

  10. [题解向] 正睿Round409

    \(\rm Link\) 然而泥萌没有权限是看不了题目的233. \(\rm T1\) 大概就是个map,脑残出题人认为(x,x)不属于有序二元组,我可qtmd.于是只拿了\(\rm 60pts\) ...