引言
今天说一个细分的需求,在模型中,或者使用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 在模型里链式调用毫无压力: