Как эти утверждения базы данных могут быть более производительными и красноречивыми? - PullRequest
0 голосов
/ 11 июля 2019

Прежде всего, я думаю, что на этот вопрос нужно много времени, чтобы подумать над ним и попросить вас разобраться с ним, если вам действительно будет весело.

Так вот мой вопрос:

Я создал систему бронирования для автомобилей с 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
    ]);
}

Мой код выглядит довольно плохо, и запросы не очень производительны. В этой системе бронирования будет много машин и мало заказов одновременно. Я думаю, что было бы лучше сначала получить все автомобили из указанного места, а затем отсортировать их в зависимости от указанного периода времени и доступности.

Есть ли лучший способ получить доступные автомобили? Если нет, то есть ли способ сделать мой код немного чище?

1 Ответ

0 голосов
/ 11 июля 2019

eloquent уже оптимизирован для повышения производительности, но вы можете повысить производительность еще больше, если будете следовать стандартам красноречивых отношений. https://laravel.com/docs/5.8/eloquent

Ваш ответ также можно найти здесь. Laravel Eloquent против построителя запросов - зачем использовать eloquent для снижения производительности

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