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

Laravel Eloquent如何实现多条件嵌套查询筛选指定业务数据

问题原因

你写的Eloquent查询返回全量数据,核心有两个问题:

  • 代码存在语法错误:orWhere('status','5'5) 多写了冗余的5,'2022-01-01 缺失闭合单引号,会直接导致查询解析异常
  • 没有对OR条件做逻辑分组:Laravel中链式调用orWhere时默认会将条件平级拼接,由于SQL中AND优先级高于OR,不加分组会完全破坏你原本的条件逻辑,导致筛选失效。

另外你贴的内容存在两处笔误:

  1. 按你描述的规则,status=5时要求的创建时间是2022-06-01而非原生SQL里写的2022-01-01
  2. 预期结果表存在数据错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 13:09:18