Yii多条件查询:实现部分条件支持“全量获取”的方案
Yii框架多条件查询实现“全量获取”的解决方案
我清楚你要实现的需求:当$filterStatus的值为*时,完全不加入status字段的筛选条件,匹配所有数据;当它是具体值(比如'Draft')时,才用该值过滤status,同时保留currency的固定筛选。下面给你几种可行的实现方式,顺便说下你之前代码出错的问题:
方法一:先构建条件数组
这种方式直观易懂,先初始化基础筛选条件,再根据$filterStatus的值动态追加条件:
$filterCurrency = 'eur'; $filterStatus = '*'; // 可能为'Draft'、null或* // 初始化基础条件,固定筛选currency $conditions = ['currency' => $filterCurrency]; // 只有当filterStatus不是*时,才添加status条件 if ($filterStatus !== '*') { // 如果你需要处理null的情况:比如null也表示全量,就把判断改成`$filterStatus !== '*' && $filterStatus !== null` $conditions['status'] = $filterStatus; } $orders = Orders::find() ->where($conditions) ->all();
方法二:链式调用动态追加条件
贴合Yii的链式调用风格,先创建基础查询对象,再根据条件判断是否追加status筛选:
$filterCurrency = 'eur'; $filterStatus = '*'; // 先创建带currency条件的查询对象 $query = Orders::find()->where(['currency' => $filterCurrency]); // 当filterStatus不是*时,追加status条件 if ($filterStatus !== '*') { $query->andWhere(['status' => $filterStatus]); } $orders = $query->all();
你之前的代码为什么报错?
你尝试的写法存在PHP语法错误:在链式调用的中间直接插入if语句是不允许的,PHP无法识别这种中断的链式写法。必须先把查询对象赋值给一个变量(比如上面的$query),再在变量上进行条件判断和方法调用。
另外,如果你直接把status设为null,Yii会生成status IS NULL的SQL语句,这并不是“全量获取”的效果,所以必须通过条件判断来决定是否添加这个筛选条件,而不是简单传入null。
内容的提问来源于stack exchange,提问作者user1525
相关产品推荐
相关产品推荐

