Laravel中用whereBetween与orWhere筛选日期范围时如何仅获取status=2的数据
搞定你的Laravel查询问题!
嘿,我一眼就发现问题所在了——SQL逻辑运算符的优先级在搞鬼!你现在的查询之所以会返回status=1的数据,是因为AND的优先级比OR高,导致你的条件被数据库解析成了:
(
created_atbetween '2018-05-09' and '2018-05-10') OR (created_atlike '%2018-05-10%' andstatus= '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
相关产品推荐
相关产品推荐

