Вам нужно разделить запросы.
Бронирования:
$booked = DB::table('vehicles')
->select('bookings.*', 'vehicles.*')
->join('bookings', function($query) use ($date) {
$query
->on('bookings.vehicle_id', '=', 'vehicles.id')
->where('date', '=', $date);
})
->get();
Доступно:
$available = DB::table('vehicles')
->whereNotExists(function($query) use ($date) {
$query
->select(DB::raw(1))
->from('bookings')
->whereRaw('bookings.vehicle_id = vehicle.id')
->where('bookings.event_date','=', $date);
})
->get();
Изменение возврата:
return view('bookings.status', compact('available', 'booked'));
И используйте $ available и $ booked вместо одной переменной данных в вашем представлении.
OR
Получить все данные в одном запросе.
$data = DB::table('vehicles')
->select('bookings.*', 'vehicles.*')
->leftJoin('bookings', function($query) use ($data) {
$query
->on('bookings.vehicle_id', '=', 'vehicle.id')
->where('date', '=', $date);
})
->get();
И, например, проверить наличие пустого «event_date».
Доступно:
@foreach($data as $row)
@if(!$row->event_date)
...table row...
@endif
@endforeach
Бронирования:
@foreach($data as $row)
@if($row->event_date)
...table row...
@endif
@endforeach