近期在做一个社区APP,管理后台中的文章管理功能涉及到了对文章进行一个条件筛选的功能,后台不是很懂,只能按照自己的思路来实现它:
管理界面中做一个表单,内容有:标题、作者、文章状态、起止时间范围等input,js控制这个表单提交的内容,有输入的就提交,没输入的就不提交,标题和作者我做了输入提示,用了thinkphp的模糊搜索,可以做联想输入;文章状态就三种:未审核、通过审核和用户自主屏蔽;起止时间,如果不选终止时间,那么就是从开始时间算到今天,如果不填开始时间,则从0开始,数据库我存入的时间都是时间戳,所以,这里做表单提交的时候,我也转换成了时间戳。
关于url传参,网上搜索了一番,得到一个解决方案:
JS使用encodeURIComponent()
对表单的内容进行编码传递给后台,后台接收储存到了$word
里面,然后PHPurldecode($word)
解码。
解码完成之后,再对这个字符串进行处理,
$start='';
$end='';
$state=0;
$start_time=0;
$writer = '';
$title = '';
$words = $word;
$option = 'false';
$create = 'asc';
$solt = 'asc=true,';
$array = array();
$where = array();
if(!empty($word)){
$word = urldecode($word);
$word = explode(',' , $word);
foreach ($word as $key => $value) {
if(count(explode('=' , $value)) == 2){
$array[explode('=' , $value)[0]] = explode('=' , $value)[1];
}
}
}
foreach ($array as $k => $v) {
if($k == 'title'){
$where['title'] = array('like',array('%'.$v.'%'));
$title = $v;
$option = 'true';
}
if ($k == 'start') {
$option = 'true';
$where['create_time'] = array('>',$v);
$start_time = $v;
$start = date("Y-m-d H:i:s",$v) ;
}
if ($k == 'end') {
$option = 'true';
$where['create_time'] = array(['<',$v],['>',$start_time],'and');
$end = date("Y-m-d H:i:s",$v) ;
}
if ($k == 'state') {
$where['states'] = $v;
$state = $v;
$option = "true";
}
if ($k == 'writer') {
$result = Db::name('user')->where('name',$v )->value('user');
$where['writer'] = $result;
$writer = $v;
$option = 'true';
// Cookie::set('writer',$writer,3600);
if($result != null){
$where['writer'] = $result;
}else{
}
}
if($k == 'asc'){
$create = 'asc';
$solt = 'asc=true,';
}
if($k == 'desc'){
$create = 'desc';
$solt = 'desc=true,';
}
}
代码写的糟糕,勿见怪!
这里得出一个数组$where
,这就是thinkphp多条件筛选的条件数组了!
title%3D每日心情%2Cwriter%3D奥创硅材_李全%2Cstate%3D1%2Cstart%3D1555404600%2Cend%3D1556179500%2C
{"title":["like",["%每日心情%"]],"writer":"18027046690","states":"1","create_time":[["<","1556179500"],[">","1555404600"],"and"]}
如下图
Db::name('article')->where($where)->order("create_time".' '.$create)->select();
最后筛选完成!