Laravel Eloquent - 在哪里

mus*_*aya 5 laravel eloquent

Laravel 4.2中,我试图实现一个返回所有具有所有特定活动的用户的查询.截至目前,我有一个查询返回所有具有许多活动之一的用户:

//$selectedActivities being an array
        $userByActivities = User::with('activities')
                ->whereHas('activities', function($query) use($selectedActivities){
                    $query->whereIn('id', $selectedActivities);
                })->get();
Run Code Online (Sandbox Code Playgroud)

更清楚:给定的活动a,b,c.我正在寻找所有活动为AND b和c的用户.我的查询返回所有具有OR b OR c活动用户.

谢谢您的帮助.

编辑:

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

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
Run Code Online (Sandbox Code Playgroud)

鉴于Jarek Tkaczyk提供的解决方案:

$userByActivities = User::with('activities')
 ->whereHas('activities', function($query) use($selectedActivities) {
     $query->selectRaw('count(distinct id)')->whereIn('id', $selectedActivities);
 }, '=', count($selectedActivities))->get();
Run Code Online (Sandbox Code Playgroud)

对于类似的请求,导致以下查询:

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
Run Code Online (Sandbox Code Playgroud)

luk*_*ter 9

你必须为此添加多个whereHas:

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

  • 对于未知数量的相关项目来说,这太过分了。您应该将计数调整为“count(distinct id)”,并使“whereHas”查找数组中的确切项目数。 (2认同)

小智 6

如果您遇到的Cardinality violation: 1241 Operand should contain 2 column(s)问题是嵌套selectCount添加到正常情况select count(*)而不是覆盖现有选择,那么更改为$query->distinct()->whereIn('id', $selectedActivities);对我来说是可行的,或者更改为$query->select(DB::raw(count(distinct id)))