В настоящее время я создаю систему бронирования для ресторана, и у меня есть вопрос относительно крайних случаев при бронировании. чтобы отфильтровать таблицы, которые недоступны, я пытаюсь получить резервирование и отфильтровать таблицы. например, если бронирование a начинается 17 июня в 11:00 и заканчивается 17 июня в 12:00, вы не сможете забронировать этот стол на этот период времени, однако вы сможете завершить более раннее бронирование в 11:00 и начать новое бронирование в 12:00 для этого стола.
это код, который у меня был в laravel, который сделал это (вроде):
$startDate = $request->query('start_date');
$endDate = $request->query('end_date');
$people_amount = $request->query('people_amount');
$reservation_id = $request->query('reservation_id');
$tables = Table::all();
$reservations = Reservation::whereBetween('start_datetime', [$startDate, $endDate])->orWhereBetween('end_datetime', [$startDate, $endDate])->get();
это сработало отлично, за исключением того, что он не учитывает крайние случаи, поэтому я сделал это:
$reservations = Reservation::where([['start_datime', '>', $startDate],
['start_datetime', '<', $endDate]
])->orWhere([['start_datetime', '>', $startDate],
['end_datetime', '>', $startDate]]);
где-то я ошибся, но хоть убей, я не могу понять. любая помощь будет принята с благодарностью!
(это весь код):
public function showTables(Request $request)
{
$startDate = $request->query('start_date');
$endDate = $request->query('end_date');
$people_amount = $request->query('people_amount');
$reservation_id = $request->query('reservation_id');
$tables = Table::all();
// $reservations = Reservation::whereBetween('start_datetime', [$startDate, $endDate])->orWhereBetween('end_datetime', [$startDate, $endDate])->get();
// dd($reservations);
$reservations = Reservation::where([['start_datetime', '<', $startDate],
['start_datetime', '>', $endDate]
])->orWhere([['start_datetime', '<', $startDate],
['end_datetime', '<', $startDate]])->get();
if (isset($reservation_id)) {
$reservations = $reservations->filter(function ($item) use ($reservation_id) {
return $item->id != $reservation_id;
});
}
// dd($reservations);
foreach ($reservations as $key => $reservation) {
foreach ($tables as $key => $table) {
if ($table->seats_amount < $people_amount) {
unset($tables[$key]);
}
if ($table->id === $reservation->table_id) {
unset($tables[$key]);
}
}
}
TableCollection::wrap('tables');
return new TableCollection($tables);
}
редактировать, исправление:
$reservations = Reservation::where([['start_datetime', '>', $startDate],
['start_datetime', '<', $endDate]
])->orWhere([['end_datetime', '>', $startDate],
['end_datetime', '<', $endDate]])->orWhere([['start_datetime', '<', $startDate],
['end_datetime', '>', $startDate]])->orWhere([['start_datetime', '=', $startDate],
['end_datetime', '=', $endDate]])->get();