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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 12:27:04