Этот вопрос действительно сложно сформулировать, поэтому я прошу прощения за заголовок!
Допустим, у меня есть модель Rooms
и модель Bookings
, в одной комнате может быть много бронирований.
Я создаю таблицу с фильтрами, и мне нужно иметь возможность запустить фильтр для отношений бронирования, если есть бронирование, иначе все равно получите запись.
Допустим, у моего номера такие же отношения бронирования
public function latestBooking(){
return $this->hasOne('App\Models\Bookings', 'room_id', 'id')
->orderBy('expiry_date', 'DESC')->limit(1);
}
Приведенные выше отношения дают мне последнее бронирование.
Я использую фильтр "Свободен от", например, так:
if ($request->has('filters.vacant_from')) {
$rooms = $rooms->whereHas('latestBooking', function ($query) use ($request) {
$query->where('expiry_date', '<', Carbon::createFromFormat('d/m/Y',$request->input('filters.vacant_from'))->format('Y-m-d'));
});
}
Проблема в том, что он получает только те номера, которые забронированы и доступны после указанной даты. Мне нужно, чтобы он мог обыскать все номера, если у него есть бронирование, проверить, не истекает ли срок действия после указанной даты, если у него нет последнего бронирования, все равно получить его как свободный номер.
По сути, как бы я структурировал свою функцию фильтра так, чтобы она работала так
Поиск во всех номерах, если у него последнее бронирование, проверьте, что срок его действия истекает после указанной даты, и захватите его только в том случае, если оно действительно / не занято, если у него нет последнего бронирования, тогда захватите его в любом случае как вакантно