Laravel Eloquent получить где нет, поиск, где есть, когда не ноль - PullRequest
0 голосов
/ 30 августа 2018

Этот вопрос действительно сложно сформулировать, поэтому я прошу прощения за заголовок!

Допустим, у меня есть модель 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'));
    });
}

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

По сути, как бы я структурировал свою функцию фильтра так, чтобы она работала так

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

Ответы [ 3 ]

0 голосов
/ 30 августа 2018

отношение бронирования должно быть таким,

public function latestBooking(){
    return $this->hasMany('App\Models\Bookings')->orderBy('expiry_date', 'DESC');
}

так как это отношения один ко многим. отношения между людьми

и вы можете написать свой фильтр так,

  if ($request->has('filters.vacant_from')) {
        $rooms = $rooms->whereHas('latestBooking', function ($query) use ($request) {
            $query->whereDate('expiry_date', '<', Carbon::createFromFormat('d/m/Y',$request->input('filters.vacant_from'))->format('Y-m-d'));
        });
    }

вы можете использовать whereDate для запуска запросов даты в laravel. Надеюсь, это поможет

0 голосов
/ 30 августа 2018

У меня есть для вас предложение относительно вашего latestBookingRelationship. Вы должны создать другое отношение и добавить к нему условие greater than today и, возможно, назвать его activeLatestBooking.

Тогда ваше последнее бронирование должно включать все номера бронирования, независимо от того, активно их бронирование или нет.

public function activeLatestBooking(){
        return $this->hasOne('App\Models\Bookings', 'room_id', 'id')
        ->where('expiry_date', '>', date('d/m/Y', strtotime('today')))->orderBy('expiry_date', 'DESC')->limit(1);
    }

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'));
        })->orWhereDoesntHave('latestBooking');
    }

Запрос фильтра выполняет следующее: он получает все последние бронирования, чье expiry_date меньше, чем vacant_from дата ... и orWhereDoesntHave получает все комнаты, которые никогда не были забронированы.

0 голосов
/ 30 августа 2018

Предполагается, что у вас есть hasMany отношение между Rooms и Bookings моделью с именем bookings

$rooms = Rooms::whereHas('bookings', function ($query) use ($request) {
            $query->whereDate('expiry_date', '<', Carbon::createFromFormat('d/m/Y',$request->input('filters.vacant_from'))->format('Y-m-d'));
        })->orWhereDoesntHave('bookings')->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...