如何使用Laravel Eloquent包裹OR条件构造指定查询且不使用DB::raw?
问题原因
你当前写法生成的SQL逻辑存在优先级问题:SQL中AND运算符的优先级高于OR,你写的代码实际执行的SQL为:
SELECT * FROM results WHERE home_team_id = ? OR away_team_id = ? AND media IS NOT NULL
这种逻辑下只要home_team_id匹配,哪怕media为NULL也会被查询到,所以才会返回3条结果,不符合你的预期。
解决方案
使用Eloquent的**逻辑分组(闭包where)**功能,把球队ID匹配的两个OR条件放到同一个闭包中,框架会自动给这部分条件加上括号,完全不需要借助DB::raw,正确代码如下:
return Result::where(function ($query) use ($clubId) { $query->where('home_team_id', $clubId) ->orWhere('away_team_id', $clubId); }) ->whereNotNull('media') ->get();
上述代码生成的SQL和你需要的原生SQL完全一致:
SELECT * FROM results WHERE (home_team_id = ? OR away_team_id = ?) AND media IS NOT NULL
最终会正确返回2条media不为NULL的匹配结果。
内容的提问来源于stack exchange,提问作者Zabs
相关产品推荐
相关产品推荐

