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
相关产品推荐
相关产品推荐

