laravel eloquent: whereDate not found 记录包含在期间

Posted

技术标签:

【中文标题】laravel eloquent: whereDate not found 记录包含在期间【英文标题】:laravel eloquent: whereDate not found record included into the period 【发布时间】:2021-11-02 08:36:30 【问题描述】:

我有一个包含两个日期字段的表格:

reservation_begin booking_end

我想知道从 8 月 25 日到 8 月 31 日占用我的预订。

在我的选择查询中:

Booking::select ('id', ''name', reservation_begin', 'reservation_end')
                        ->whereDate('reservation_begin', '>=', $startDate)
                        ->whereDate('reservation_end', '<=', $endDate)
                        ->get();

如果出现以下情况,我将无法在数据库中找到该记录: $startDate = '2021-08-25'; $endDate = '2021-09-01' (从 8 月 25 日到 9 月 1 日)。

我想要包含 8 月 25 日至 8 月 31 日期间的预订,而 8 月 25 日至 9 月 1 日期间的预订仍包括该期间,我该如何取出?

感谢您的帮助

【问题讨论】:

我不知道这是否是一个错误,但在第一个 whereDate 中&gt; = 之间有一个空格。尝试删除它并尝试 您还想要任何重叠预订吗?这些将occupy 任何一天,而不是全部。如果是这样,请尝试:-&gt;whereDate('reservation_begin', '&lt;=', $endDate)-&gt;whereDate('reservation_end', '&gt;=', $startDate) @MarvinCollins 打错了,原代码没有空格 @JonArmstrong :该解决方案无法正常工作。我想选择时间段,例如:8 月 25 日到 8 月 31 日,我想要包含这些日期的所有记录,例如:从 25 到 31 到 23 到 31 到 1 月 23 日到 9 月 30 日 从 8 月 31 日到 2 日9 月等所有从 8 月 25 日到 31 日“穿越”的人 请检查我的 SQL 示例(在答案中)。我展示了您的逻辑(第一个),然后展示了几个解决方案(第二个和第三个)。这些确实提供了重叠案例,这是我认为您所要求的。 【参考方案1】:

这里有一个直接SQL的测试用例,只是为了展示各种逻辑用例和结果。这可以帮助确定要使用的 laravel/eloquent 逻辑:

Working SQL test case (updated)

包含一些数据的表(使用 mysql):

CREATE TABLE booking (
    booking_id         int   primary key auto_increment
  , reservation_begin  date
  , reservation_end    date
);

INSERT INTO booking (reservation_begin, reservation_end) VALUES
    (current_date, current_date + 3)
  , ('2021-08-25', '2021-09-01')
  , ('2021-08-21', '2021-08-24')
  , ('2021-08-23', '2021-08-25')
  , ('2021-09-01', '2021-09-04')
  , ('2021-09-02', '2021-09-07')
;

你的逻辑和结果:

WITH args (xstart, xend) AS (SELECT '2021-08-25', '2021-09-01')
SELECT t1.*, args.*
  FROM booking AS t1
  JOIN args
    ON t1.reservation_end   <= args.xend 
   AND t1.reservation_begin >= args.xstart 
;

包括重叠案例(仅返回匹配项)和结果:

WITH args (xstart, xend) AS (SELECT '2021-08-25', '2021-09-01')
SELECT t1.*, args.*
  FROM booking AS t1
  JOIN args
    ON args.xstart <= t1.reservation_end
   AND args.xend   >= t1.reservation_begin
;

包括重叠情况(返回匹配项,不匹配项加上 null),加上结果:

WITH args (xstart, xend) AS (SELECT '2021-08-25', '2021-09-01')
SELECT t1.*, args.*
  FROM      booking AS t1
  LEFT JOIN args
    ON args.xstart <= t1.reservation_end
   AND args.xend   >= t1.reservation_begin
;

【讨论】:

以上是关于laravel eloquent: whereDate not found 记录包含在期间的主要内容,如果未能解决你的问题,请参考以下文章

php Laravel 5 Eloquent CheatSheet #laravel #eloquent

php [Eloquent CheatSheet] Eloquent #laravel #eloquent的常见查询方法

获取 Laravel 5.4 的每日数据

Laravel - Eloquent 连接

Laravel 从 Raw DB 到 Eloquent

Laravel/Eloquent 建议覆盖 trait 属性?