Laravel Eloquent - 在哪里

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/28633389/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-14 10:59:03  来源:igfitidea点击:

Laravel Eloquent - Where In All

laraveleloquent

提问by musaya

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:

Laravel 4.2 中,我试图实现一个返回所有用户的查询,这些用户具有所有某些活动。到目前为止,我有一个查询返回所有具有许多活动之一的用户:

//$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.

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

Thank you for your help.

感谢您的帮助。

EDIT:

编辑:

The solution offered by lukasgeiterresults in following query:

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

Whereas the solution offered by Jarek Tkaczyk:

Jarek Tkaczyk提供的解决方案:

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

for a similar request, results in following query:

对于类似的请求,会产生以下查询:

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

回答by lukasgeiter

You'll have to add multiple whereHasfor that:

您必须为此添加多个whereHas

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

回答by Victor Priceputu

If you are getting Cardinality violation: 1241 Operand should contain 2 column(s)the problem is the nested selectCountadds to the normal select count(*)instead of overriding the existing select, so changing to $query->distinct()->whereIn('id', $selectedActivities);did the trick for me, or changing to $query->select(DB::raw(count(distinct id)))

如果您遇到Cardinality violation: 1241 Operand should contain 2 column(s)问题是嵌套selectCount添加到法线select count(*)而不是覆盖现有选择,因此更改为$query->distinct()->whereIn('id', $selectedActivities);对我有用,或更改为$query->select(DB::raw(count(distinct id)))