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

Laravel Eloquent:如何正确分组OR与AND查询条件

解决Eloquent查询的条件分组问题

这个问题其实是因为SQL中AND的优先级高于OR,你原来的Eloquent写法会让查询构造器按顺序拼接条件,导致实际执行逻辑和预期不符。

问题原因

你原来的代码:

Title::where('word', 'lovers')->orWhere('word', 'lover')->where('domain', $resultFromFirstKeyword->domain)->get();

生成的SQL会先执行 word = 'lover' AND domain = 'www.texasbirdlovers.com',再和 word = 'lovers' 做OR判断,完全偏离了你想要的“先匹配word的两个值,再匹配domain”的逻辑。

解决方案1:用闭包包裹OR条件(通用分组写法)

通过闭包来包裹需要分组的OR条件,Eloquent会自动为这部分条件添加括号,确保逻辑优先级正确:

Title::where(function ($query) {
    // 这里面的条件会被包裹在括号里
    $query->where('word', 'lovers')
          ->orWhere('word', 'lover');
})->where('domain', $resultFromFirstKeyword->domain)->get();

这样生成的SQL就是你期望的:

SELECT * FROM `title` WHERE (`word` = 'lovers' OR `word` = 'lover') AND `domain` = 'www.texasbirdlovers.com'

解决方案2:用whereIn简化写法(更优雅)

因为你是对同一个word字段匹配多个值,完全可以用whereIn替代多个orWhere,代码更简洁,生成的SQL逻辑也一致:

Title::whereIn('word', ['lovers', 'lover'])
     ->where('domain', $resultFromFirstKeyword->domain)
     ->get();

这个写法生成的SQL和上面的分组写法效果一样,而且可读性更高,推荐优先使用这种方式。

内容的提问来源于stack exchange,提问作者Mr J

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:19:06