Laravel избегать дублирования дат - PullRequest
0 голосов
/ 21 мая 2018

Я новичок в 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 хранится в таблице бронирований (поскольку одну комнату нельзя забронировать дважды в одном и том же диапазоне).

Любая помощь будет признательна,

Спасибо!

Ответы [ 4 ]

0 голосов
/ 22 июня 2019

У меня было похожее использование, где мне нужно было проверить, запланировал ли человек что-то в диапазоне дат

Пример кода laravel ниже:

 $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";  
 }

0 голосов
/ 21 мая 2018

Вы должны проверить это в базе данных.Таким образом, вы можете сделать это:

$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
}
0 голосов
/ 26 ноября 2018

В типичном перекрытии, учитывая два события 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]); 
}

Наконец, я могу проверить, занята ли комната с идентификатором 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";
}

Надеюсь, это вам поможет.

0 голосов
/ 21 мая 2018

Есть встроенный метод Carbon isPast (), поэтому вы можете использовать:

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

Вы можете проверить, были ли оба выбранных были забронированы в прошлом.

Если вы не использовали Carbonэто ссылка: https://carbon.nesbot.com/docs/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...