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

Laravel中用whereBetween与orWhere筛选日期范围时如何仅获取status=2的数据

搞定你的Laravel查询问题!

嘿,我一眼就发现问题所在了——SQL逻辑运算符的优先级在搞鬼!你现在的查询之所以会返回status=1的数据,是因为AND的优先级比OR高,导致你的条件被数据库解析成了:

(created_at between '2018-05-09' and '2018-05-10') OR (created_at like '%2018-05-10%' and status = '2')

这就意味着,只要created_at在09到10号之间,哪怕status=1也会被查出来,完全不符合你的需求。

正确的写法来啦

你需要把所有日期相关的条件用**分组(括号)**包起来,确保status=2是对所有日期条件的过滤。在Laravel里,用闭包就能轻松实现分组查询:

$this->to = '2018-05-10';
$this->from = '2018-05-09';

Table::where('status', 2)
    ->where(function($query) {
        // 把所有日期筛选条件放在这个闭包里,确保它们是一组的
        $query->whereBetween('created_at', [$this->from, $this->to])
              ->orWhere('created_at', 'like', '%' . $this->to . '%');
    })
    ->get();

为什么这样就对了?

这段代码生成的SQL会变成:

select * from `table` where `status` = '2' and (`created_at` between '2018-05-09' and '2018-05-10' or `created_at` like '%2018-05-10%')

现在status=2会作用于整个日期条件组,只有状态为2且符合日期要求的数据才会被返回,完美解决你的问题!

额外小建议

其实你那个orWhere like的条件有点多余,而且用like查日期字段性能也不太好。你可以把$this->to改成带时分秒的格式,直接用whereBetween就能覆盖当天所有数据:

$this->to = '2018-05-10 23:59:59';
$this->from = '2018-05-09';

Table::where('status', 2)
    ->whereBetween('created_at', [$this->from, $this->to])
    ->get();

这样写法更简洁规范,还能避免不必要的模糊查询,效率更高哦~


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:11:00