php服务端搜索,功能改进
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服务端搜索,功能改进的更多相关文章
- Bootstrap插件系列——Bootstrap-table初始化、分页、客户端搜索、服务端搜索
又好久不写博客,最近项目都是用的bootstrap的样式,不出意外,应该是要在bootstrap的道路上越走越远了,所以下定决心,把bootstrap的插件都好好学学. 昨天写了boostrap-ta ...
- Vue.js与 ASP.NET Core 服务端渲染功能整合
http://mgyongyosi.com/2016/Vuejs-server-side-rendering-with-aspnet-core/ 原作者:Mihály Gyöngyösi 译者:oop ...
- SuperWebSocket实现服务端和WebSocket4Net实现客户端
SuperWebSocket实现服务端和WebSocket4Net实现客户端具体实现如下: SuperWebSocket实现服务端 注:本作者是基于vs2019 enterprise版本,所有项目均为 ...
- WebSocket——SuperWebSocket实现服务端和客户端
WebSocket——SuperWebSocket实现服务端和客户端具体实现如下: 注:本作者是基于vs2019 enterprise版本,所有项目均为.Net Framwork4.7版本(因为Web ...
- 服务端事件EventSource揭秘
服务端推 服务端推,指的是由服务器主动的向客户端发送消息(响应).在应用层的HTTP协议实现中,"请求-响应"是一个round trip,它的起点来自客户端,因此在应用层之上无法实 ...
- ASP.NET Core 与 Vue.js 服务端渲染
http://mgyongyosi.com/2016/Vuejs-server-side-rendering-with-aspnet-core/ 原作者:Mihály Gyöngyösi 译者:oop ...
- Headless Chrome:服务端渲染JS站点的一个方案【上篇】【翻译】
原文链接:https://developers.google.com/web/tools/puppeteer/articles/ssr 注:由于英文水平有限,没有逐字翻译,可以选择直接阅读原文 tip ...
- 实现PHP服务端和c#客户端数据交换
服务端实现功能1,数据库的访问dbhelper.php包括执行语句返回多行,返回json数据,返回单条记录,返回第一行第一列的整数,返回第一行第一列的浮点数,返回第一行第一列的双精度数,返回第一行第一 ...
- Linux下用gSOAP开发Web Service服务端和客户端程序
网上本有一篇流传甚广的C版本的,我参考来实现,发现有不少问题,现在根据自己的开发经验将其修改,使用无误:另外,补充同样功能的C++版本,我想这个应该更有用,因为能用C++,当然好过受限于C. 1.gS ...
随机推荐
- jenkins自动打包生成docker镜像后自动发布并nginx代理访问
之前曾写过docker及jenkins基础使用 https://www.cnblogs.com/xiaochangwei/category/816943.html 现在搭建环境的功能为: 1.jen ...
- windows10下Bad owner or permissions on .ssh/config的解决办法
方法很简单,亲测有效. 1.进入如下路径C:\Users\用户名\.ssh,你会看到有config这个文件 2.右击config,属性→安全→高级→禁止继承→删除所有继承(忘了全称了,大概这个意思)→ ...
- 浙大&川大提出脉冲版ResNet:继承ResNet优势,实现当前最佳
浙大&川大提出脉冲版ResNet:继承ResNet优势,实现当前最佳 选自arXiv,作者:Yangfan Hu等,机器之心编译. 脉冲神经网络(SNN)具有生物学上的合理性,并且其计算潜能和 ...
- zz从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史
从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史 Bert最近很火,应该是最近最火爆的AI进展,网上的评价很高,那么Bert值得这么高的评价吗?我个人判断是值得.那为什么 ...
- 洛谷 P2357 守墓人
洛谷 P2357 守墓人 题目描述 在一个荒凉的墓地上 有一个令人尊敬的守墓人, 他看守的墓地从来 没有被盗过, 所以人们很放心的把自己的先人的墓 安顿在他那 守墓人能看好这片墓地是必然而不是偶然.. ...
- 【oracle】oracle11g安装失败 提示找不到文件,模板General_Purpose.dbc不存在
先确定一下自己的安装包是不是一起解压的! 不是就重新解压,重新装. 是,剩下的我也不会
- [探究] $\mu$函数的性质应用
参考的神仙An_Account的blog,膜一下. 其实就是一类反演问题可以用\(\mu\)函数的性质直接爆算出来. 然后其实性质就是一个代换: \[\sum_{d|n}\mu(d)=[n=1]\] ...
- [LeetCode] 91. Decode Ways 解码方法
A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A' - ...
- 北漂不易,逆风前行[给想在北京工作的java同学们诚恳的建议!]
作为一个北漂程序员(java开发),从业6年,北漂十一年,走了不少弯路,也曾孤独彷徨,楼主今天特地总结了一些经验,希望能给大家(准备做北漂 或 北漂的朋友们)一点启发.从生活.专业和薪水这2个方向来分 ...
- 原生/CM系列网络叹号问题
网络叹号问题: 原因:某墙屏蔽了谷歌,而原生安卓是利用谷歌的服务器来测试网络是否通畅的 解决方案:修改网络测试的服务器地址 方案来源:https://www.noisyfox.io/android-c ...