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 中> =
之间有一个空格。尝试删除它并尝试
您还想要任何重叠预订吗?这些将occupy
任何一天,而不是全部。如果是这样,请尝试:->whereDate('reservation_begin', '<=', $endDate)
->whereDate('reservation_end', '>=', $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的常见查询方法