Laravel 拉雷维尔雄辩-到底在哪里

Laravel 拉雷维尔雄辩-到底在哪里,laravel,eloquent,Laravel,Eloquent,在Laravel4.2中,我试图实现一个返回所有用户的查询,这些用户拥有所有特定的活动。到目前为止,我有一个查询,该查询返回具有多个活动之一的所有用户: //$selectedActivities being an array $userByActivities = User::with('activities') ->whereHas('activities', function($query) use($selectedActivitie

在Laravel4.2中,我试图实现一个返回所有用户的查询,这些用户拥有所有特定的活动。到目前为止,我有一个查询,该查询返回具有多个活动之一的所有用户:

//$selectedActivities being an array
        $userByActivities = User::with('activities')
                ->whereHas('activities', function($query) use($selectedActivities){
                    $query->whereIn('id', $selectedActivities);
                })->get();
更清楚地说:给定活动a、b、c。我正在寻找所有有活动a、b和c的用户。我的查询返回具有活动a、b或c的所有用户

谢谢你的帮助

编辑:

由提供的解决方案将导致以下查询:

select * from `users` where 
        (select count(*) from `activities` inner join `activity_user` on `activities`.`id` = `activity_user`.`activity_id` where `activity_user`.`user_id` = `users`.`id` and `id` = '7') >= 1 
        and (select count(*) from `activities` inner join `activity_user` on `activities`.`id` = `activity_user`.`activity_id` where `activity_user`.`user_id` = `users`.`id` and `id` = '3') >= 1 
        and (select count(*) from `activities` inner join `activity_user` on `activities`.`id` = `activity_user`.`activity_id` where `activity_user`.`user_id` = `users`.`id` and `id` = '1') >= 1 
        and (select count(*) from `activities` inner join `activity_user` on `activities`.`id` = `activity_user`.`activity_id` where `activity_user`.`user_id` = `users`.`id` and `id` = '2') >= 1
select * from `users` where (select count(distinct id) from `activities` 
    inner join `activity_user` on `activities`.`id` = `activity_user`.`activity_id` 
    where `activity_user`.`user_id` = `users`.`id` and `id` in ('7', '3', '1', '2')) = 4
鉴于以下机构提供的解决方案:

对于类似的请求,将生成以下查询:

select * from `users` where 
        (select count(*) from `activities` inner join `activity_user` on `activities`.`id` = `activity_user`.`activity_id` where `activity_user`.`user_id` = `users`.`id` and `id` = '7') >= 1 
        and (select count(*) from `activities` inner join `activity_user` on `activities`.`id` = `activity_user`.`activity_id` where `activity_user`.`user_id` = `users`.`id` and `id` = '3') >= 1 
        and (select count(*) from `activities` inner join `activity_user` on `activities`.`id` = `activity_user`.`activity_id` where `activity_user`.`user_id` = `users`.`id` and `id` = '1') >= 1 
        and (select count(*) from `activities` inner join `activity_user` on `activities`.`id` = `activity_user`.`activity_id` where `activity_user`.`user_id` = `users`.`id` and `id` = '2') >= 1
select * from `users` where (select count(distinct id) from `activities` 
    inner join `activity_user` on `activities`.`id` = `activity_user`.`activity_id` 
    where `activity_user`.`user_id` = `users`.`id` and `id` in ('7', '3', '1', '2')) = 4

为此,您必须添加多个
,其中有

$query = User::with('activities');
foreach($selectedActivities as $activityId){
    $query->whereHas('activities', function($q) use ($activityId){
        $q->where('id', $activityId);
    });
}
$userByActivities = $query->get();

如果您遇到基数冲突:1241个操作数应该包含2列,问题是嵌套的selectCount会添加到正常的select count(*)中,而不是覆盖现有的select,因此更改为
$query->distinct()->其中('id',$selectedActivities)
为我做了这个把戏,或者改为
$query->select(DB::raw(count(distinct id))

现在你这么说似乎合乎逻辑。非常感谢您的帮助。对于数量未知的相关项目来说,这太过分了。您应该将计数调整为
count(distinct id)
,并使
whereHas
查找数组中项目的确切数量。@JarekTkaczyk如何做?
$query->distinct()->其中('id',$selectedActivities)为我工作,感谢Jarek Tkaczyk提出的解决方案比公认的解决方案优化得多