在另一个 table Laravel 中查找在 pivot table 中具有所有 ID 的记录

Find records which has all ids in pivot table in another table Laravel

在我的 laravel 项目中,我有 table 如下所示。

groupsusers是多对多的关系,也就是说一个用户可以属于多个组。

group_usertable中间table表示哪个用户属于哪个组

slot_votes table 记录用户对插槽的投票。它与groupstable的关系是groupstablehasManyslot_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();