Это мои модели 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
Вместо этого я получаю все идентификаторы транспортных средств