gpt4 book ai didi

Laravel 避免日期重叠

转载 作者:行者123 更新时间:2023-12-04 00:04:39 26 4
gpt4 key购买 nike

我是 Laravel 的新手,正在尝试实现在任何一天都不能重叠的预订日期。

我有一个名为“Bookings”的模型,其中包括 room_id、start_date 和 end_date。

我有验证检查结束日期不能早于开始日期:

$this->validate($request, [
'start_date' => 'required|date',
'end_date' => 'required|date|after_or_equal:start_date',
]);

但是我不确定如何检查日期范围是否与预订表中存储的同一 room_id 的任何其他日期范围不冲突(因为一个房间不能在同一范围内预订两次)。

任何帮助将不胜感激,

谢谢!

最佳答案

在典型的重叠中,给定两个事件 A 和 B,您必须考虑四种情况:

  1. 事件 A 包含事件 B
  2. 事件 B 包含事件 A
  3. 事件 A 的结束日期与事件 B 的开始日期重叠
  4. 事件 B 的结束日期与事件 A 的开始日期重叠

因此,在 sql 中检查房间是否在某个日期间隔内忙碌,比如说 2018-11-20' 和 '2018-11-30' 它将是:

select * 
from rooms
where
start_date between '2018-11-20' and '2018-11-30' or
end_date between '2018-11-20' and '2018-11-30' or
'2018-11-20' between start_date and end_date or
'2018-11-30' between start_date and end_date;

在 laravel 中我所做的是在模型中创建一个范围。

public function scopeByBusy($query,$start_date,$end_date) 
{
return $query->whereBetween('start_date', [$start_date, $end_date])
->orWhereBetween('end_date', [$start_date, $end_date])
->orWhereRaw('? BETWEEN start_date and end_date', [$start_date])
->orWhereRaw('? BETWEEN start_date and end_date', [$end_date]);
}

最后,我可以像这样验证 id 为 95 的房间是否在 '2018-11-20' 和 '2018-11-30' 之间忙碌:

$room_id = 95;
$start = '2018-11-20';
$end = '2018-11-30';
$exists = Rooms::where('id', $room_id)
->byBusy($start, $end)
->first();

if($exists)
{
echo "the room is busy in the interval you selected";
}

希望对你有帮助。

关于Laravel 避免日期重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50442364/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com