【问题标题】:laravel eloquent: whereDate not found record included into the periodlaravel eloquent: whereDate not found 记录包含在期间
【发布时间】: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 示例(在答案中)。我展示了您的逻辑(第一个),然后展示了几个解决方案(第二个和第三个)。这些确实提供了重叠案例,这是我认为您所要求的。

标签: sql laravel laravel-8


【解决方案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
;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-04
    • 2014-05-17
    • 2015-07-23
    • 2015-06-24
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多