You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 16:06:41