php - 在 Laravel 语句中使用多个连接会覆盖值
问题描述
我正在尝试创建一个 Laravel 语句,该语句应该为每个用户返回正确的值,以获取答案数量和问题数量,如下所示:
$users = User::join('user_answers', 'users.id', '=', 'users_answers.user_id')
->join('user_questions', 'users.id', '=', 'user_questions.user_id')
->select(
'users.id',
'users.username',
DB::raw('COUNT(user_answers.user_id) AS answers'),
DB::raw('COUNT(user_questions.user_id) AS questions')
)
->groupBy('users.id');
注意: groupBy 是它工作所必需的,因为它在 DataTables 中使用,否则它将只显示一行。
当我试图:
dd($users->first());
我得到的是这样的:
如您所见,出于某种原因,问题和答案的值相同,并且不正确。我想连接有某种重叠。
例如,如果我删除其中一个连接,只保留其中一列,则数字显示正确,如下所示:
老实说,我在这里很迷茫,希望能得到一些帮助。
谢谢!
解决方案
好久没用 Eloquent 了,不知道有没有“雄辩”的方式用一个查询来做到这一点。但在 SQL 中,我会在 SELECT 子句中使用相关子查询:
$users = User::select(
'users.id',
'users.username',
DB::raw('(
SELECT COUNT(*)
FROM user_answers
WHERE users_answers.user_id = users.id
) AS answers'),
DB::raw('(
SELECT COUNT(*)
FROM user_questions
WHERE user_questions.user_id = users.id
) AS questions'),
);
推荐阅读
- java - 如何在同一个 JFrame 上同时显示多个按钮?
- python - Plotly: How to manually change the legend items when plotting columns?
- elasticsearch - 使用 Elasticsearch 数据源的 Grafana 中没有可用的指标
- c - 如果字符输入正确,C 程序应该启动
- java - 用于验证列表中元素长度的注释
- java - 如何使用布尔条件过滤java流?
- html - 在标题标签内时不出现背景图像
- c# - 如何延长音频合成器的时间长度?
- swift - 我正在尝试快速执行搜索操作
- javascript - 为什么 *ngFor 看似无限循环?