如何使用Laravel和Eloquent在两个日期之间查询?

2022-08-30 06:21:20

我正在尝试创建一个报表页,用于显示从特定日期到特定日期的报表。这是我当前的代码:

$now = date('Y-m-d');
$reservations = Reservation::where('reservation_from', $now)->get();

这在普通 SQL 中的作用是 。select * from table where reservation_from = $now

我在这里有这个查询,但我不知道如何将其转换为雄辩的查询。

SELECT * FROM table WHERE reservation_from BETWEEN '$from' AND '$to

如何将上面的代码转换为雄辩的查询?提前感谢您。


答案 1

whereBetween 方法验证列的值是否介于两个值之间。

$from = date('2018-01-01');
$to = date('2018-05-02');

Reservation::whereBetween('reservation_from', [$from, $to])->get();

在某些情况下,您需要动态添加日期范围。根据@Anovative的评论,您可以这样做:

Reservation::all()->filter(function($item) {
  if (Carbon::now()->between($item->from, $item->to)) {
    return $item;
  }
});

如果您想添加更多条件,则可以使用。如果要排除日期间隔,则可以使用 。orWhereBetweenwhereNotBetween

Reservation::whereBetween('reservation_from', [$from1, $to1])
  ->orWhereBetween('reservation_to', [$from2, $to2])
  ->whereNotBetween('reservation_to', [$from3, $to3])
  ->get();

其他有用,其中子句:、 、 、 、 。whereInwhereNotInwhereNullwhereNotNullwhereDatewhereMonthwhereDaywhereYearwhereTimewhereColumn whereExistswhereRaw

Laravel关于 Where Clauses的文档。


答案 2

另一个选项,如果您的字段是而不是(尽管它适用于这两种情况):datetimedate

$fromDate = "2016-10-01";
$toDate   = "2016-10-31";

$reservations = Reservation::whereRaw(
  "(reservation_from >= ? AND reservation_from <= ?)", 
  [
     $fromDate ." 00:00:00", 
     $toDate ." 23:59:59"
  ]
)->get();

推荐