首页 > 解决方案 > 在 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());

我得到的是这样的:

例子

如您所见,出于某种原因,问题和答案的值相同,并且不正确。我想连接有某种重叠。

例如,如果我删除其中一个连接,只保留其中一列,则数字显示正确,如下所示:

示例 2

老实说,我在这里很迷茫,希望能得到一些帮助。

谢谢!

标签: phpmysqllaraveljoineloquent

解决方案


好久没用 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'),
        );

推荐阅读