如何在CakePHP 4.3.5的OR条件中使用isNull表达式
在CakePHP 4.3.5的自定义Finder中构建包含isNull的OR条件
你需要在自定义finder中同时匹配基础条件,并且满足「Tasks.contact_id为NULL」或「Contacts.status=1」的OR逻辑,以下是几种可行的实现方式:
方法1:数组条件中嵌入表达式对象
直接在OR数组里混合使用表达式对象和普通数组条件,CakePHP会自动解析处理:
public function findMyTasks(Query $query, array $options): object { $query ->where([ 'Tasks.status' => $options['status'], 'Tasks.user_id' => $options['user_id'], 'OR' => [ $query->newExpr()->isNull('Tasks.contact_id'), ['Contacts.status' => 1] ], ]); return $query; }
方法2:用闭包构建完整条件
通过QueryExpression闭包构建所有条件,适合更复杂的逻辑场景:
public function findMyTasks(Query $query, array $options): object { $query->where(function (QueryExpression $exp, Query $q) use ($options) { // 添加基础等值条件 $exp->eq('Tasks.status', $options['status']) ->eq('Tasks.user_id', $options['user_id']); // 构建OR分支 $orGroup = $exp->or_( $exp->isNull('Tasks.contact_id'), $exp->eq('Contacts.status', 1) ); return $exp->add($orGroup); }); return $query; }
方法3:字符串形式的NULL判断
如果逻辑简单,也可以直接用SQL字符串写法:
public function findMyTasks(Query $query, array $options): object { $query ->where([ 'Tasks.status' => $options['status'], 'Tasks.user_id' => $options['user_id'], 'OR' => [ 'Tasks.contact_id IS NULL', ['Contacts.status' => 1] ], ]); return $query; }
注意:你最初写的['Tasks.contact_id' => null]会被CakePHP转换为Tasks.contact_id = NULL,这在SQL中是无效的(NULL不能用=判断),所以必须明确使用IS NULL相关写法。
内容的提问来源于stack exchange,提问作者Zenzs
相关产品推荐
相关产品推荐

