Как Виктор упоминает в своем ответе, вы можете использовать whereHas
вот так:
PlanSubmission::whereHas('advisor', function ($query) {
$query->where('name', request('advisor_name'));
});
Вы не спрашивали об этом напрямую, но я заметил, что вы используете условные выражения для создания разные запросы. Eloquent предлагает несколько способов сделать это немного приятнее.
Первое, что отчасти очевидно, это то, что возвращается любой метод, который вы вызываете конструктором (запросом), который вы можете просто добавить. Возможно, в ваших двух случаях были некоторые общие ограничения:
public function index()
{
$query = PlanSubmission::where('something', 42);
if (request()->has('status')) {
$query = $query->where('status', request('status'));
} elseif (..) {
...
}
return $query->paginate(25);
}
Другой способ выполнения условных запросов в Laravel - использовать when
. Например, для статуса:
$query = $query->when(request->has('status'), function ($query) {
// note that you don't have to return the query
$query->where('status', request('status'));
});
// or PlanSubmission::>when(..)
В вашем примере вы не можете одновременно фильтровать по status
И advisor_name
, но давайте предположим, что это будет нормально, тогда вы можете объединить все следующим образом:
public function index()
{
return PlanSubmission::query()
//->where('something', 42)
->when(request->has('status'), function ($query) {
$query->where('status', request('status'));
})
->when(request->has('advisor_name'), function ($query) {
$query->whereHas('advisor', function ($query) {
$query->where('name', request('advisor_name'));
});
})->paginate(25);
}
Этот подход может показаться многословным для простых запросов, и тогда можно использовать if
условия, но для сложных запросов when
может быть полезным. Также в этой ситуации хорошо работает идея «создания запроса». Вы можете передавать построитель запросов и непрерывно его наращивать.