Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

musaya's avatar

Eloquent - WhereIn All

In Laravel 4.2, I am trying to achieve a query that returns all users, that have all of certain activities. As of now, I have a query that returns all users that have one of many activities:

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

To be more clear: given activities a,b,c. I am looking for all users that have activity a AND b AND c. My query returns all users that have activity a OR b OR c.

Thank you for your help.

0 likes
8 replies
JarekTkaczyk's avatar
Level 53

@musaya I suppose it is MySQL, so here it goes:

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

It's five years later, but what about for SQL Server?

JarekTkaczyk's avatar

@musaya Yeah, lukasgeiter knows it as well. However this time his solution is overkill. It adds subquery for each id you want to check. The way I showed is what you should do here.

irclever's avatar

I have exact same problem but for me, lukasgeiter's solution on SO works but the accepted solution here gives me Cardinality violation: 1241 Operand should contain 2 column(s). I'd prefer to reduce the number of queries using @JarekTkaczyk's elegant solution. Any ideas? Let me know if you need more info.

Thanks

automanual's avatar

@irclever I ran into the same issue. Replacing ->selectRaw(...) with ->select(\DB::raw('count(distinct id)')) worked for me

5 likes

Please or to participate in this conversation.