之前写过两篇文章,都是自己遇到的问题:

地址分别是:

第一篇文章遇到了错误,然后写了第二篇文章,本来以为问题已经解决了,但是出现了新的问题。

一、问题

在第二篇文章中我将 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

这是因为, ThinkPHP在执行where条件解析的时候读到了错误的数组格式

二、解决:

上面的方法 当 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;
    }
}

QQ截图20170522225517.jpg