Чтобы достичь того, что вам нужно, вы можете использовать смесь когда () и гдеHas () :
$films = Film
::when($request->input('first'), function ($query, $first) {
$query->whereHas('options', function ($query) use ($first) {
$query->where('first', $first);
});
})
->when($request->input('second'), function ($query, $second) {
$query->whereHas('options', function ($query) use ($second) {
$query->where('second', $second);
});
})
->when($request->input('age'), function ($query, $age) {
$query->whereHas('ageRatings', function ($query) use ($age) {
$query->where('age', $age);
});
})
->when($request->input('country'), function ($query, $country) {
$query->whereHas('locations', function ($query) use ($country) {
$query->where('country', $country);
});
})
->when($request->input('city'), function ($query, $city) {
$query->whereHas('locations', function ($query) use ($city) {
$query->where('city', $city);
});
})
->orderBy('updated_at', 'desc')
->get();
По сути, что выше делает, говорит, что когда вы отправили непустое значение, он добавит предложение where к запросу для этого отношения
, например, если отправлено main
, ограничит фильмы только теми, у которых есть категории, когда основной является отправленное значение.
Кроме того, просто для справки, вам не нужно добавлять метод from(...)
при использовании Eloquent.
Простой способ ограничения числа линий добавит областей к вашей Film
модели, например
В вашей Film
модели:
public function scopeHasMain($query, $main)
{
$query->whereHas('options', function ($query) use($first) {
$query->where('first', $first);
});
}
Тогда ваш метод when()
будет :
when($request->input('first'), function ($query, $first) {
$query->hasFirst($first);
})