Laravel Eloquent - 总位置
Laravel Eloquent - Where In All
在 Laravel 4.2 中,我试图实现一个 returns 具有所有特定活动的所有用户的查询。截至目前,我有一个查询 returns 所有具有许多活动之一的用户:
//$selectedActivities being an array
$userByActivities = User::with('activities')
->whereHas('activities', function($query) use($selectedActivities){
$query->whereIn('id', $selectedActivities);
})->get();
更清楚:给定活动 a、b、c。我正在寻找具有 activity a AND b AND c 的所有用户。我的查询 returns 所有拥有 activity a 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
而 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
您必须为此添加多个 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(*)
而不是覆盖现有的 select,所以更改为 $query->distinct()->whereIn('id', $selectedActivities);
对我有用,或者改成 $query->select(DB::raw(count(distinct id)))
在 Laravel 4.2 中,我试图实现一个 returns 具有所有特定活动的所有用户的查询。截至目前,我有一个查询 returns 所有具有许多活动之一的用户:
//$selectedActivities being an array
$userByActivities = User::with('activities')
->whereHas('activities', function($query) use($selectedActivities){
$query->whereIn('id', $selectedActivities);
})->get();
更清楚:给定活动 a、b、c。我正在寻找具有 activity a AND b AND c 的所有用户。我的查询 returns 所有拥有 activity a 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
而 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
您必须为此添加多个 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(*)
而不是覆盖现有的 select,所以更改为 $query->distinct()->whereIn('id', $selectedActivities);
对我有用,或者改成 $query->select(DB::raw(count(distinct id)))