Прежде всего, я думаю, что на этот вопрос нужно много времени, чтобы подумать над ним и попросить вас разобраться с ним, если вам действительно будет весело.
Так вот мой вопрос:
Я создал систему бронирования для автомобилей с Laravel, и в ней есть страница приветствия с формой, которая позволяет вводить местоположение пользователя, а также дату начала и окончания бронирования. После отправки формы пользователь отправляется на сайт с указанием всех автомобилей, доступных в указанном месте и период времени.
Вот код, который проверяет, какие автомобили доступны:
public function findCar(Request $request)
{
//Validating the Data
$this->validate($request,[
'Standort' => 'bail|required',
'Startdatum' => 'bail|required|date',
'Enddatum' => 'bail|required|date|after_or_equal:Startdatum'
]);
//Get all the data from the form
$start = Input::get('Startdatum',false);
$end = Input::get('Enddatum',false);
$place = Input::get('Standort',false);
$start = strtotime($start);
$end = strtotime($end);
//Getting all cars from the given city
$city_id = City::where('name','=',$place)->get('id');
$carsCity = Car::where('id_currentCity','=',$city_id[0]->id)->get();
//Getting the IDs of the cars that collide with the given time period
$collidingBookings = Booking::where('begin','<',$end)->where('end','>',$start+86399)->get();
$partiallyCollidingBookings = Booking::where('begin','<',$end+86399)->where('end','>=',$start)->get();
$collidingID = array();
foreach ($collidingBookings as $collidingBooking){
array_push($collidingID,$collidingBooking->id_car);
}
$partiallyCollidingID = array();
foreach ($partiallyCollidingBookings as $partiallyCollidingBooking){
array_push($partiallyCollidingID,$partiallyCollidingBooking->id_car);
}
//Getting the available cars, which bookings are not even partially colliding with other bookings and the partially available cars that are not colliding fully
$availableCars = $carsCity->whereNotIn('id',$partiallyCollidingID);
$partiallyAvailableCars = $carsCity->whereNotIn('id',$collidingID)->diff($availableCars);
return view('pages.findCar',[
'place' => $place,
'start' => $start,
'end' => $end,
'availableCars' => $availableCars,
'partiallyAvailableCars' => $partiallyAvailableCars
]);
}
Мой код выглядит довольно плохо, и запросы не очень производительны. В этой системе бронирования будет много машин и мало заказов одновременно. Я думаю, что было бы лучше сначала получить все автомобили из указанного места, а затем отсортировать их в зависимости от указанного периода времени и доступности.
Есть ли лучший способ получить доступные автомобили? Если нет, то есть ли способ сделать мой код немного чище?