3分钟短文 | Laravel SQL筛选两个日期之间的记录,怎么写?

2020-08-13 14:52:15 浏览数 (1)

引言

今天说一个细分的需求,在模型中,或者使用laravel提供的 Eloquent ORM 功能,构造查询语句时,返回位于两个指定的日期之间的条目。应该怎么写?

本文通过几个例子,为大家梳理一下。

学习时间

假设有一个模型 Reservation,我们查询某个日期的预订条目数,首先构造日期字符串,使用内置函数:

代码语言:javascript复制
$now = date('Y-m-d');

返回当前日期。然后调用模型的 where 查询语句:

代码语言:javascript复制
$reservations = Reservation::where('reservation_from', $now)->get();

上一条生成的SQL语句如下:

代码语言:javascript复制
select * from table_name where reservation_from = $now

只会返回日期比较相等的条目。如何实现在 from 和 to 之间的日期呢,类似下面这样:

代码语言:javascript复制
SELECT * FROM table_name WHERE reservation_from BETWEEN '$from' AND '$to

在laravel中你可以使用 whereBetween 这个查询子句。首先构造起始和结束日期:

代码语言:javascript复制
$from = date('2020-01-01');
$to = date('2020-08-09');

然后调用查询子句:

代码语言:javascript复制
Reservation::whereBetween('reservation_from', [$from, $to])->get();

这样就返回SQL查询的 BETWEEN ... AND .... 语句了。

当然了,上面的方法是在SQL中直接进行筛选,如果查询结果限制的条目本身比较少,也能充分利用索引,所以不担心查询的速度,那么我们可以在查询完成后,在返回的 Eloquent Collection 集合上,链式调用过滤 filter 方法进行筛选。

那么代码实现起来像下面这样:

注意程序写起来很柔顺,使用 Carbon 提供的 between 方法进行判断。程序上下文很好理解。

如果考虑初始查询条件圈定的记录条目过多,会对MySQL造成流量的压力,那么在SQL阶段直接筛选出最精准的记录,无疑是个好习惯。whereBetween 在模型里链式调用毫无压力:

0 人点赞