Laravel запросов: Получить все транспортные средства без бронирования в указанном диапазоне дат c. - PullRequest
1 голос
/ 10 февраля 2020

Это мои модели vehicle и booking:

class Booking extends Model
{
    ....
    public function vehicle(){
        return $this->belongsTo('App\Models\Vehicle', 'vehicle_id');
    }
    ....
}

class Vehicle extends Model
{
    ....
    public function bookings(){
        return $this->hasMany('App\Models\Booking', 'vehicle_id');
    }
    ....
}

В моем контроллере я хочу получить все транспортные средства, которые не имеют заказов в указанные даты, так что это то, что у меня есть пока пробовал:

public function availabillity(Request $request){

        $bookings = Booking::query();
        $vehicles = Vehicle::query();

        $selectedStart = Carbon::createFromFormat('d/m/Y H:i',  $request['start']); 
        $selectedEnd =  Carbon::createFromFormat('d/m/Y H:i',  $request['end']);
        //$availableVehicles = [];

        $availableVehicles = $vehicles->select('vehicles.id')->leftjoin('bookings', function ($join) use ($selectedStart, $selectedEnd){
            $join->on('vehicles.id', '=', 'bookings.vehicle_id')
                ->where([
                        ['bookings.start', '<',$selectedStart], //selected start is between booking dates
                        ['bookings.end', '>', $selectedStart]
                    ])->orWhere([
                        ['bookings.start', '<',$selectedEnd],   //selected end is between boking dates
                        ['bookings.end', '>', $selectedEnd]
                    ])->orWhere([
                        ['bookings.start', '>',$selectedStart],  //booking dates are between selected start and selected end
                        ['bookings.end', '<', $selectedEnd]
                    ]);
            })->distinct('vehicles.id')->get();


       $res = [];
       $res['vehicles'] = $availableVehicles;
       $res['selected_start'] = $selectedStart ;
       $res['selected_end'] = $selectedEnd;

       return response($res);


    }

Но это не работает. Я все еще получаю все машины, хотя у меня есть заказ с:

start: 2020-02-05 11:40:00
end:   2020-02-10 12:40:00

, и мой запрос на даты:

start: 2020-02-05 12:01:00
end:   2020-02-12 12:00:00

Как я могу изменить свой запрос, чтобы получить доступные транспортные средства ? Есть ли более эффективный способ вместо сложного запроса? Может быть, изменив мои модели?

РЕДАКТИРОВАТЬ

Это мои таблицы:

Заказы:

+----+---------------------+---------------------+------------+
| id | start               | end                 | vehicle_id |
+----+---------------------+---------------------+------------+
| 29 | 2020-02-05 11:40:00 | 2020-02-10 12:40:00 | 38         |
+----+---------------------+---------------------+------------+

Транспортные средства

+----+
| id |
+----+
| 37 |
+----+
| 38 |
+----+
| 39 |
+----+
| 40 |
+----+

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

37,39,40

Вместо этого я получаю все идентификаторы транспортных средств

Ответы [ 2 ]

1 голос
/ 10 февраля 2020
public function availabillity(Request $request){

    $selectedStart = Carbon::createFromFormat('d/m/Y H:i',  $request['start']); 
    $selectedEnd =  Carbon::createFromFormat('d/m/Y H:i',  $request['end']);
    //$availableVehicles = [];

    $availableVehicles = $vehicles->whereDoesntHave('bookings', function($query) use ($selectedStart, $selectedEnd) {
        $query->where([
                    ['bookings.start', '<',$selectedEnd], 
                    ['bookings.end', '>', $selectedStart]
                ]);
    })->get();


   $res = [];
   $res['vehicles'] = $availableVehicles;
   $res['selected_start'] = $selectedStart ;
   $res['selected_end'] = $selectedEnd;

   return response($res);


}
0 голосов
/ 10 февраля 2020

Я думаю, что проблема здесь в том, что вы используете orWhere, он будет возвращать каждую строку, выполнив одно из условий, которое оказывается всеми из них.

Изменить orWhere для where и он будет использовать «и» вместо «или», и он должен работать.

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