Laravel 4 或者Wherehas-雄辩查询上的参数分组-我如何在Laravel中做到这一点?

Laravel 4 或者Wherehas-雄辩查询上的参数分组-我如何在Laravel中做到这一点?,laravel-4,Laravel 4,在我构建的一个雄辩的查询中,我使用Laravel 4.1的whereHas和或whereHas方法对has关系进行约束 在示例足球应用程序中,我希望对homeClub和awayClub关系设置一个约束,这样我就可以确定结果集将选择homeClub=阿森纳或awayClub=阿森纳的位置 这个问题是从一个问题演变而来的,当使用或where has方法时,生成的sql不会对或约束进行分组 查询(放置约束的相关摘录): 这将生成sql: SELECT * FROM `broadcasts` WHERE

在我构建的一个雄辩的查询中,我使用Laravel 4.1的
whereHas
或whereHas
方法对
has
关系进行约束

在示例足球应用程序中,我希望对
homeClub
awayClub
关系设置一个约束,这样我就可以确定结果集将选择homeClub=阿森纳或awayClub=阿森纳的位置

这个问题是从一个问题演变而来的,当使用
或where has
方法时,生成的sql不会对
约束进行分组

查询(放置约束的相关摘录):

这将生成sql:

SELECT * FROM `broadcasts` WHERE 

(SELECT count(*) FROM `uploads` WHERE `broadcasts`.`upload_id` = `uploads`.`id` and `type` = 'international-audience') >= '1' 
and 
(SELECT count(*) FROM `clubs` WHERE `clubs`.`id` = `broadcasts`.`home_club_id` and `name` = 'Arsenal') >= '1' 
or 
(SELECT count(*) FROM `clubs` WHERE `clubs`.`id` = `broadcasts`.`away_club_id` and `name` = 'Arsenal') >= '1' 
and 
(SELECT count(*) FROM `seasons` WHERE `broadcasts`.`season_id` = `seasons`.`id` and `name` = '2012/13') >= '1' 
and 
(SELECT count(*) FROM `territories` WHERE `broadcasts`.`territory_id` = `territories`.`id` and `region` = 'Australia') >= '1'
但是,这不是我想要的,因为提到雄辩的声明,俱乐部查询是,上面的查询要么选择主场俱乐部约束,要么选择awayClub、赛季名称、地区。我打算使用以下SQL:

SELECT * FROM `broadcasts` WHERE 

(SELECT count(*) FROM `uploads` WHERE `broadcasts`.`upload_id` = `uploads`.`id` and `type` = 'international-audience') >= '1' 
and 
((SELECT count(*) FROM `clubs` WHERE `clubs`.`id` = `broadcasts`.`home_club_id` and `name` = 'Arsenal') >= '1' 
or 
(SELECT count(*) FROM `clubs` WHERE `clubs`.`id` = `broadcasts`.`away_club_id` and `name` = 'Arsenal') >= '1' )
and 
(SELECT count(*) FROM `seasons` WHERE `broadcasts`.`season_id` = `seasons`.`id` and `name` = '2012/13') >= '1' 
and 
(SELECT count(*) FROM `territories` WHERE `broadcasts`.`territory_id` = `territories`.`id` and `region` = 'Australia') >= '1'
注。。club子查询上的括号


有人知道我会如何写这篇雄辩的提问吗?我真的不想回到fluent/joins。

您需要引用传递给where闭包的查询。否则,您将绕过任何分组将分组where子句添加到主查询:

$ret
->where( function( $query ){
    $query->whereHas('homeClub', function ( $subquery ){
        $subquery->where('name','Arsenal' );
    })
    ->orWhereHas('awayClub',function ( $subquery ){
        $subquery->where('name','Arsenal' );
    });
})
->where( function ( $query ) use ( $parameterValues ){
    $query->whereHas('season', function ($subquery) use ( $parameterValues ){
        $subquery->where('name', $parameterValues['season_names'] );
    });
})
->whereHas('territory',function( $query ) use ( $parameterValues ){     
    $query->where('region','Australia');
})
->get();
$ret
->where( function( $query ){
    $query->whereHas('homeClub', function ( $subquery ){
        $subquery->where('name','Arsenal' );
    })
    ->orWhereHas('awayClub',function ( $subquery ){
        $subquery->where('name','Arsenal' );
    });
})
->where( function ( $query ) use ( $parameterValues ){
    $query->whereHas('season', function ($subquery) use ( $parameterValues ){
        $subquery->where('name', $parameterValues['season_names'] );
    });
})
->whereHas('territory',function( $query ) use ( $parameterValues ){     
    $query->where('region','Australia');
})
->get();