В типичном перекрытии, учитывая два события A и B, вы должны рассмотреть четыре сценария:
- Событие A содержит событие B
- Событие B содержит событие A
- Дата окончания события A перекрывается с датой начала события B
- Дата окончания события 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]);
}
Наконец, я могу проверить, занята ли комната с идентификатором 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";
}
Надеюсь, это вам поможет.