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

Laravel查询构造器when()方法生成错误条件查询问题咨询

Laravel查询when方法逻辑异常问题解答

结论

这不是Laravel框架的Bug,属于查询构造器的写法问题。

问题原因

  • SQL本身的运算符优先级规则:AND优先级高于OR,你原始代码生成的无括号SQL,会被数据库解析为 causer_id = '251' OR [(subject_id = '251' AND subject_type = 'App\User') AND description = 'created'],只要满足causer_id = 251就会命中查询,自然会出现忽略description条件的情况。
  • when方法的设计逻辑:when仅做条件判断触发闭包执行的作用,不会自动给闭包内的查询逻辑套括号,这种设计是为了兼容更多灵活的查询场景,如果自动加括号反而会破坏大量已有的正常查询逻辑。

正确写法

要实现你预期的「用户条件整体和description做AND运算」的逻辑,只需要给用户相关的OR条件外层套一层where闭包,Laravel就会自动给这部分条件加上括号:

$user=251;
$description='created';
Activity::when($user, function ($query, $user) {
    // 外层新增where闭包包裹整组OR条件
    return $query->where(function ($query) use ($user) {
        $query->where('causer_id', $user)
        ->orWhere(function($query) use ($user) {
            $query->where('subject_id', $user)
            ->where('subject_type', "App\\User");
        });
    });
})->when($description, function ($query, $description) {
    return $query->where('description', $description);
});

上述代码生成的SQL就是你预期的带括号的格式,查询逻辑完全符合需求。

内容的提问来源于stack exchange,提问作者Daniel Malmgren

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 02:36:03