有谁知道这个新功能是否可以在多个关系上执行?
例如,我有一个查询,我不仅要过滤俱乐部名称(相关问题),还要过滤区域名称.
在这个例子中,我想查询结果,其中俱乐部(俱乐部关系)的名字是阿森纳,而该地区是澳大利亚(领土关系)
$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' );
});
Run Code Online (Sandbox Code Playgroud)
执行此查询时 - 结果不会仅限whereHas于俱乐部区域.
可以在哪里链接过滤以前关系的结果在哪里?有没有建议?
谢谢
乔恩
edi*_*999 27
是的,这是可能的.
生成的SQL可能是:
SELECT * FROM ... WHERE (territory constraint) AND (homeClub constratint) OR (awayClub constraint)
Run Code Online (Sandbox Code Playgroud)
这意味着如果awayClub constraint满足,则将检索该行.我想你想为生成的sql添加一个括号:
SELECT * FROM ... WHERE (territory constraint) AND ((homeClub constratint) OR (awayClub constraint))
Run Code Online (Sandbox Code Playgroud)
要做到这一点,你需要将两个查询嵌套在where:
$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' );
});
});
Run Code Online (Sandbox Code Playgroud)
感谢edi9999向正确的方向展示 - 我没有正确考虑参数分组
use 在匿名函数中主要的雄辩对象,我在homeClub和awayClub上放置了whereHas和orWhereHas约束,这就是诀窍.
$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');
});
});
Run Code Online (Sandbox Code Playgroud)