如何使用Yii2 ORM构建排除col1和col2均为0的查询语句
用Yii2 ORM实现指定查询逻辑
没问题,这两种写法都能完美实现你的需求,而且完全符合Yii2 ORM的最佳实践:
方法一:直接对应原SQL的OR嵌套条件
如果你想严格对应原SQL的AND (col1 <> 0 OR col2 <> 0)逻辑,可以用Yii2查询构建器的嵌套OR条件写法:
// 假设你的模型类是TableModel $query = TableModel::find() // 先添加你的基础条件 [some conditions] ->where(['status' => 1, 'category' => 'default']) // 示例条件,替换成你的实际条件 // 再添加排除逻辑:col1不等于0 或者 col2不等于0 ->andWhere(['or', ['<>', 'col1', 0], ['<>', 'col2', 0], ]);
这个写法会生成和你原SQL完全一致的条件部分,Yii2会自动把数组里的or作为逻辑运算符,将后面的两个不等于条件用OR连接,并且整体作为AND的子条件。
方法二:用NOT排除同时为0的情况
另一种更直观的写法是直接表达“排除col1和col2同时为0的记录”,逻辑上和原SQL等价,代码更简洁:
$query = TableModel::find() ->where(['status' => 1, 'category' => 'default']) // 你的基础条件 ->andWhere(['not', ['col1' => 0, 'col2' => 0]]);
这个写法对应的SQL是AND NOT (col1 = 0 AND col2 = 0),和原SQL的逻辑完全一致,而且代码可读性更高,推荐这种写法。
两种方式都不需要用到EXCEPT命令,完全通过Yii2的ORM查询构建器实现,你可以根据自己的习惯选择其中一种。
内容的提问来源于stack exchange,提问作者MiglyCH
相关产品推荐
相关产品推荐

