Laravel在多个关系中

时间:2014-01-24 15:01:41

标签: laravel-4

有谁知道这个new feature是否可以在多个关系中执行?

例如,我有一个查询,我不仅要过滤俱乐部名称(related question),还要过滤区域名称。

在这个例子中,我想查询结果,其中俱乐部(俱乐部关系)的名称是阿森纳,而该地区是澳大利亚(领土关系)

$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?有没有建议?

感谢

乔恩

3 个答案:

答案 0 :(得分:24)

是的,这是可能的。

生成的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))

要做到这一点,您需要将两个查询嵌套在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' );
        });
    });

答案 1 :(得分:7)

感谢edi9999向正确的方向展示 - 我没有正确考虑parameter grouping

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');
             });
        });

答案 2 :(得分:0)

我认为你不需要'因为有' 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' );
    });