Laravel Eloquent - где все

В Laravel 4.2 я пытаюсь выполнить запрос, который возвращает всех пользователей, которые выполняют все определенные действия. На данный момент у меня есть запрос, который возвращает всех пользователей, которые выполняют одно из многих действий:

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

Чтобы быть более понятным: приведенные мероприятия а, б, в. Я ищу всех пользователей, которые имеют активность а б и в в. Мой запрос возвращает всех пользователей, у которых есть активность ИЛИ b ИЛИ 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

Принимая во внимание, что решение, предлагаемое Jarek Tkaczyk:

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

для аналогичного запроса приводит к следующему запросу:

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

1 ответ

Решение

Вам придется добавить несколько whereHas для этого:

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

Если вы получаете Cardinality violation: 1241 Operand should contain 2 column(s) проблема во вложенных selectCount добавляет к нормальному select count(*) вместо переопределения существующего выбора, поэтому изменение на $query->distinct()->whereIn('id', $selectedActivities); сделал трюк для меня, или переход на $query->select(DB::raw(count(distinct id)))

Другие вопросы по тегам