在另一个 table Laravel 中查找在 pivot table 中具有所有 ID 的记录
Find records which has all ids in pivot table in another table Laravel
在我的 laravel 项目中,我有 table 如下所示。
groups
和users
是多对多的关系,也就是说一个用户可以属于多个组。
group_user
table中间table表示哪个用户属于哪个组
slot_votes
table 记录用户对插槽的投票。它与groups
table的关系是groups
tablehasManyslot_votes
.
groups
table
|id | channel_id |
+---+---------+
|1 | U124 |
|2 | U123 |
|3 | U125 |
|4 | U127 |
users
table
|id | name |
+---+---------+
|1 | A |
|2 | B |
|3 | C |
|4 | D |
group_user
table
|id | group_id | user_id |
+---+----------+-----------+
|1 | 1 | 1 |
|2 | 2 | 1 |
|3 | 2 | 2 |
|4 | 3 | 3 |
|5 | 4 | 3 |
|6 | 1 | 4 |
slot_vote
table
|id | user_id | group_id | slot |
+---+---------+-----------+-----------+
|1 | 1 | 1 | A |
|2 | 2 | 1 | B |
|3 | 2 | 2 | C |
|1 | 1 | 4 | C |
我的问题是如何使用 Laravel Eloquent 获取所有成员都投票的组 ID?
例如,如果组1的成员是$userId = [1, 4]
并且用户1和4都已投票(因此存在于slot_votes table),我想获得组1的id在结果中。
我尝试过的:
Group::whereHas('users', function ($query, $votedUser) {
$query->whereIn(
'id',
SlotVote::where('group_id', $groupId)->pluck('user_id')->unique()
);
}, '=', count($votedUser))->get();
但我不知道如何在 whereIn
子句中获取 $groupId
。另外,我担心查询性能。关于如何获得所需结果的任何想法?
先谢谢你。
我设法使用以下代码解决了这个问题:
Group::leftJoin('group_user', 'groups.id', '=', 'group_user.group_id')
->leftJoin('slot_votes', 'group_user.user_id', '=', 'slot_votes.user_id')
->selectRaw(
"groups.id, channel_id,
count(distinct group_user.user_id) as members,
count(distinct slot_votes.user_id) as voted_members",
)
->groupBy('groups.id')
->havingRaw('members=voted_members')
->get();
在我的 laravel 项目中,我有 table 如下所示。
groups
和users
是多对多的关系,也就是说一个用户可以属于多个组。
group_user
table中间table表示哪个用户属于哪个组
slot_votes
table 记录用户对插槽的投票。它与groups
table的关系是groups
tablehasManyslot_votes
.
groups
table
|id | channel_id |
+---+---------+
|1 | U124 |
|2 | U123 |
|3 | U125 |
|4 | U127 |
users
table
|id | name |
+---+---------+
|1 | A |
|2 | B |
|3 | C |
|4 | D |
group_user
table
|id | group_id | user_id |
+---+----------+-----------+
|1 | 1 | 1 |
|2 | 2 | 1 |
|3 | 2 | 2 |
|4 | 3 | 3 |
|5 | 4 | 3 |
|6 | 1 | 4 |
slot_vote
table
|id | user_id | group_id | slot |
+---+---------+-----------+-----------+
|1 | 1 | 1 | A |
|2 | 2 | 1 | B |
|3 | 2 | 2 | C |
|1 | 1 | 4 | C |
我的问题是如何使用 Laravel Eloquent 获取所有成员都投票的组 ID?
例如,如果组1的成员是$userId = [1, 4]
并且用户1和4都已投票(因此存在于slot_votes table),我想获得组1的id在结果中。
我尝试过的:
Group::whereHas('users', function ($query, $votedUser) {
$query->whereIn(
'id',
SlotVote::where('group_id', $groupId)->pluck('user_id')->unique()
);
}, '=', count($votedUser))->get();
但我不知道如何在 whereIn
子句中获取 $groupId
。另外,我担心查询性能。关于如何获得所需结果的任何想法?
先谢谢你。
我设法使用以下代码解决了这个问题:
Group::leftJoin('group_user', 'groups.id', '=', 'group_user.group_id')
->leftJoin('slot_votes', 'group_user.user_id', '=', 'slot_votes.user_id')
->selectRaw(
"groups.id, channel_id,
count(distinct group_user.user_id) as members,
count(distinct slot_votes.user_id) as voted_members",
)
->groupBy('groups.id')
->havingRaw('members=voted_members')
->get();