【发布时间】:2021-12-08 18:36:24
【问题描述】:
在我的 laravel 项目中,我的表格如下所示。
groups 和users 是多对多关系,这意味着一个用户可以属于多个组。
group_user 表是中间表,表示哪个用户属于哪个组。
slot_votes 表记录用户对 slot 的投票。它与groups table 的关系是groups table hasMany slot_votes。
groups表
|id | channel_id |
+---+---------+
|1 | U124 |
|2 | U123 |
|3 | U125 |
|4 | U127 |
users表
|id | name |
+---+---------+
|1 | A |
|2 | B |
|3 | C |
|4 | D |
group_user表
|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表
|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 表中),我想在结果中获取组 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和slot_vote并比较两个计数:COUNT(group_user.user_id)和COUNT(slot_vote.user_id) -
感谢您的回复。现在就试试。您知道如何使用多个查询来做到这一点吗?
-
子选择怎么样?
-
通过两个查询,您可以通过
group_user表上的 SELECT COUNT(user_id) 和 GROUP BY group_id 获取每个组的用户数。另一个查询在slot_vote表上执行相同操作,然后为每个 group_id 比较两个查询的计数用户。但是这样做并在结果集合上执行 PHP 搜索比在一个使用 JOIN 的查询中执行的性能要差 -
@ZarkDev 我也想知道有没有办法使用 Eloquent ORM?在这种情况下使用 ORM 而不是查询构建器更好吗?
标签: php mysql laravel eloquent laravel-query-builder