TP5同字段范围查询构建where数组条件的错误和解决方法
之前写过两篇文章,都是自己遇到的问题:
地址分别是:
- http://www.ptbird.cn/thinkphp5-where-filter.html
- http://www.ptbird.cn/thinkphp5-where-same-filed-many-query.html
第一篇文章遇到了错误,然后写了第二篇文章,本来以为问题已经解决了,但是出现了新的问题。
一、问题
在第二篇文章中我将 where 条件数组的构建改成了下面的方式:
if($min_width || $max_width){
$where['width']=array();
if($min_width-0.00!=0){
$where['width']=array(['>=',$min_width]);
}
if($max_width-0.00!=0){
array_push($where['width'],['<=',$max_width]);
}
}
首先声明这种方法是错误的,当 min_width 或者 max_width 少一个条件时,报如下错误: Undefined offset: 1 ,
这是因为,
二、解决:
上面的方法 当 min_width 存在而 max_width 存在或者反过来都是错误,只有 min_width 和 max_width 都存在的时候才是正确的。
因此我们要进行判断,边界 min 和 max 存在的三种情况:
- min 存在 而 max 不存在
- min 不存在 而 max 存在
- min 和 max 都存在
根据三种情况,来设置 where 条件:
min 和 max 只有一个存在,则 直接将 $where['width'] 赋值成数组格式
$where\['width'\]=\['<=',$max] 或者 $where\['width'\]=\['>=',$min]
min 和 max 都存在,则 $where['width'] 是二维数组格式
$where['width'][0] = ['<=',$max]
$where['width'][3] = ['>=',$min]
三、代码
因为业务逻辑中可能涉及很多个参数设置,所以写了一个通用函数来构建where条件数组。
/**
* 构建where筛选查询的条件数组
* - 分为下面几种情况:
* - $min 存在 而 $max不存在
* - $max 存在 而 $min不存在
* - $min $max都存在
* - $min $max都不存在
* @param $min double
* @param $max double
* @return $res array
*/
protected function getFilterWhereArr($min,$max){
$arr=[
'status'=>false,
'data'=>[]
];
if($min && $max && $min>$max){
// 如果$min和$max同时存在 并且$min大于$max
// 则直接返回false;
return $arr;
}
if($min){
// 如果min存在
if($max){
// 如果max存在 则两个条件需要同时成立
$arr['data'][0]=['>=',$min];
$arr['data'][4]=['<=',$max];
$arr['status']=true;
}else{
// 如果max不存在,则只需要min条件
$arr['data']=['>=',$min];
$arr['status']=true;
}
}else if($max){
// 如果min不存在 max存在 则只需要max的条件
$arr['data']=['<=',$max];
$arr['status']=true;
}
return $arr;
}
}
文章已经结束啦
文章版权:Postbird-There I am , in the world more exciting!
本文链接:http://www.ptbird.cn/tp5-wrong-where-filter.html
转载请注明文章原始出处 !
扫描二维码,在手机阅读!