Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 06.06.2018 22:46:48

Как вытащить модели с критерием по связи, а также не имеющим связи?

Добрый день,

Есть 2 модели:

Place (место для возможной аренды)
--id

и

Lease (аренда)
--id
--place_id
--started_at
--finished_at

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

Хочу запросом вытащить все Place, которые:

1. В указанный период не находятся в стадии аренды.
2. Вообще ни разу не взятые в аренду.

Набросок:

public function search(Request $request)
    {

        $started_at = $request->query('started_at');
        $finished_at = $request->query('finished_at');

              $places = Places::latest();

         if(isset($started_at) && isset($finished_at)) {

            $places->whereHas('leases', function($q) use ($started_at, $finished_at) {
                $q
                    ->where('status', '<>', StatusesLeaseHelper::STATUS_WAIT)
                    ->where(function ($qq) use ($started_at, $finished_at) {

                        $qq->where(function ($qqq) use ($started_at, $finished_at) {
                            $qqq
                                ->where('started_at', '>', $started_at)
                                ->where('started_at', '>', $finished_at);

                        })->orWhere(function ($qqq) use ($started_at, $finished_at) {
                            $qqq
                                ->where('finished_at', '<', $started_at)
                                ->where('finished_at', '<', $finished_at);
                        });
                    });
            });
}

return $places->get();

}


Насколько я понимаю, данный фрагмент отвечает условию 1. т.к. затрагивается период к связи leases (модель Lease), но не учитываются places (пункт 2.), для которых не было ни одной аренды. Подскажите пожалуйста - как можно решить сей момент?

Не в сети

#2 07.06.2018 00:20:15

AlexForever
Откуда: Кишинев
Сообщений: 31

Re: Как вытащить модели с критерием по связи, а также не имеющим связи?

Если у вас версия laravel 5.5 и выше, то можете испозовать метод orWhereDoesntHave.

$places->whereHas('leases', function($q) use ($started_at, $finished_at) {
                $q
                    ->where('status', '<>', StatusesLeaseHelper::STATUS_WAIT)
                    ->where(function ($qq) use ($started_at, $finished_at) {

                        $qq->where(function ($qqq) use ($started_at, $finished_at) {
                            $qqq
                                ->where('started_at', '>', $started_at)
                                ->where('started_at', '>', $finished_at);

                        })->orWhere(function ($qqq) use ($started_at, $finished_at) {
                            $qqq
                                ->where('finished_at', '<', $started_at)
                                ->where('finished_at', '<', $finished_at);
                        });
                    });
            })->orWhereDoesntHave('leases');

Не в сети

#3 11.06.2018 23:43:14

Re: Как вытащить модели с критерием по связи, а также не имеющим связи?

Благодарю!

Не в сети

#4 07.08.2018 01:56:18

Re: Как вытащить модели с критерием по связи, а также не имеющим связи?

Подскажите пожалуйста - будет ли верным по аналогии вместо:

->orWhereDoesntHave('leases');

Указать:

->orWhereNotExists(function ($query) {
                $query->select(DB::raw(1))
                      ->from('leases')
                      ->whereRaw('leases.place_id = places.id');
            })

Или же результаты выбора будут разниться?

И еще не подскажете - в каком файле фреймворка можно почитать метод orWhereDoesntHave?

Не в сети

Подвал раздела