Laravel Eloquent如何实现多条件嵌套查询筛选指定业务数据
问题原因
你写的Eloquent查询返回全量数据,核心有两个问题:
- 代码存在语法错误:
orWhere('status','5'5)多写了冗余的5,'2022-01-01缺失闭合单引号,会直接导致查询解析异常 - 没有对OR条件做逻辑分组:Laravel中链式调用
orWhere时默认会将条件平级拼接,由于SQL中AND优先级高于OR,不加分组会完全破坏你原本的条件逻辑,导致筛选失效。
另外你贴的内容存在两处笔误:
- 按你描述的规则,status=5时要求的创建时间是
2022-06-01而非原生SQL里写的2022-01-01 - 预期结果表存在数据错误:id=7的记录name为WER,不符合name=ABC的要求,实际符合条件的status=5记录是id=8。
正确实现代码
用闭包对不同逻辑块的条件做分组,即可准确还原筛选规则:筛选name为ABC的记录,其中status在2-4区间无日期限制,status=5时要求created_at≥2022-06-01。
// 替换YourModel为你实际对应的模型类名 $list = YourModel::where(function($query) { // 第一组条件:status在2-4之间,name为ABC $query->where('name', 'ABC') ->whereBetween('status', [2, 4]); })->orWhere(function($query) { // 第二组条件:status=5,name为ABC,创建时间满足要求 $query->where('name', 'ABC') ->where('status', 5) ->where('created_at', '>=', '2022-06-01'); })->get();
逻辑说明
上述代码生成的原生SQL会自动给两个OR连接的条件块加上括号,避免优先级错误,最终执行的WHERE逻辑等价于:
WHERE (name = 'ABC' AND status BETWEEN 2 AND 4) OR (name = 'ABC' AND status = 5 AND created_at >= '2022-06-01')
执行后返回的结果完全匹配筛选规则:
- id=2,name=ABC,status=2,created_at=2022-01-01
- id=5,name=ABC,status=3,created_at=2022-01-01
- id=8,name=ABC,status=5,created_at=2022-06-01
如果后续需要加status>5的筛选规则,只需要新增一个orWhere闭包块,在块内写对应条件即可,不会破坏现有逻辑。
内容的提问来源于stack exchange,提问作者ezles88
相关产品推荐
相关产品推荐

