Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Добрый день,
Есть 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.), для которых не было ни одной аренды. Подскажите пожалуйста - как можно решить сей момент?
Не в сети
Если у вас версия 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');
Не в сети
Благодарю!
Не в сети
Подскажите пожалуйста - будет ли верным по аналогии вместо:
->orWhereDoesntHave('leases');
Указать:
->orWhereNotExists(function ($query) {
$query->select(DB::raw(1))
->from('leases')
->whereRaw('leases.place_id = places.id');
})
Или же результаты выбора будут разниться?
И еще не подскажете - в каком файле фреймворка можно почитать метод orWhereDoesntHave?
Не в сети