拉拉维尔避免重叠日期



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

我有一个名为"预订"的模型,其中包括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";
}

我希望它对你有所帮助。

我也有类似的用法,我需要检查人们是否已经在日期范围内安排了某些事情

下面的拉拉维尔代码示例:

$start = Carbon::parse($request['start_date'])->format('Y-m-d 00:00:00');
$end = Carbon::parse($request['end_date'])->format('Y-m-d 23:59:59');
$existsActive = Microsite::where(function ($query) use ($start) {
$query->where('start_date', '<=', $start);
$query->where('end_date', '>=', $start);
})->orWhere(function ($query) use ($end) {
$query->where('start_date', '<=', $end);
$query->where('end_date', '>=', $end);
})->count();
if($existsActive > 0 ){
echo "Already exists";  
}

有内置的 Carbon 方法 isPast((,因此您可以使用:

$start_date->isPast()
$end_date->isPast()

您可以查看过去是否预订了两个选定的选项。

如果您尚未使用碳,请点击此处查看链接: https://carbon.nesbot.com/docs/

if(DB::table('rooms')->whereBetween('start_date', [$request->start_date, $request->end_date])
->orwhereBetween('end_date',[$request->start_date, $request->end_date])->exists())
{
echo "the room is busy in the interval you selected";
}

您必须在数据库中检查它。所以你可以这样做:

$result = Bookings::where('start_date', '<=' $request->start_date)->where('end_date', '>=' $request->end_date)->where('room_id',$request->room_id)->first();
if(!$result){
// Code to Book room
}

最新更新