Laravel whereHas on multiple relationship
Кто-нибудь знает, может ли эта новая функция выполнять несколько отношений?
Например, у меня есть запрос, где я хочу фильтровать не только название клуба (связанный вопрос), но и название территории.
В этом примере мне бы хотелось получить результаты запроса, в которых название клуба (клубные отношения) - это Арсенал, а регион - Австралия (отношение территории)
$ret->with('territory')->with('homeClub')->with('awayClub');
$ret->whereHas('territory',function( $query ){
$query->where('region','Australia');
})->whereHas('homeClub', function ( $query ) {
$query->where('name', 'Arsenal' );
})->orWhereHas('awayClub', function ( $query ) {
$query->where('name', 'Arsenal' );
});
При выполнении этого запроса результат не ограничивает территорию whereHas
только клубами.
Может ли быть привязана цепь, чтобы отфильтровать результаты в предыдущем соотношении whereHas? Любые предложения, если нет?
спасибо
джон
Ответы
Ответ 1
Да, возможно.
Сгенерированный SQL, вероятно, будет:
SELECT * FROM ... WHERE (territory constraint) AND (homeClub constratint) OR (awayClub constraint)
Это означает, что если awayClub constraint
выполняется, линия будет восстановлена. Я думаю, вы хотите добавить скобки в сгенерированный sql:
SELECT * FROM ... WHERE (territory constraint) AND ((homeClub constratint) OR (awayClub constraint))
для этого вам нужно вложить оба запроса внутри где:
$ret->with('territory')->with('homeClub')->with('awayClub');
$ret->whereHas('territory',function( $query ){
$query->where('region','Australia');
})
->where(function($subQuery)
{
$subQuery->whereHas('homeClub', function ( $query ) {
$query->where('name', 'Arsenal' );
})
->orWhereHas('awayClub', function ( $query ) {
$query->where('name', 'Arsenal' );
});
});
Ответ 2
Благодаря тому, что edi9999 был показан в правильном направлении, я не рассматривал группировку параметров
use
главный объект-красноречивость анонимной функции, я разместил ограничение whereHas и orWhereHas на homeClub и awayClub, и это сделало трюк.
$ret->with('territory')->with('homeClub')->with('awayClub')->with('programme');
$ret
->whereHas('territory',function( $query ) use ( $parameterValues ){
$query->where('region', $parameterValues['region_names'] );
})
->whereHas('season', function ( $query ) use ( $parameterValues ){
$query->where('name', $parameterValues['season_names'] );
})
->where( function( $subquery ) use ( $ret ){
$ret->whereHas('homeClub', function ( $query ){
$query->where('name','Arsenal' );
} );
$ret->orWhereHas('awayClub', function ( $query ){
$query->where('name','Arsenal');
});
});
Ответ 3
Я не думаю, что вам нужно "с", поскольку есть "wherehas"
Model::whereHas('territory',function( $query ){
$query->where('region','Australia');
})->whereHas('homeClub', function ( $query ) {
$query->where('name', 'Arsenal' );
})->orWhereHas('awayClub', function ( $query ) {
$query->where('name', 'Arsenal' );
});