Laravel DB raw возвращает двойную сумму - PullRequest
0 голосов
/ 09 октября 2018

Есть две таблицы: users и score.Таблица результатов содержит столбцы game_id и points.

. Этот запрос

    return DB::table('users')
        ->where('users.id', 36)
        ->leftJoin('score AS education_score', function($query){
            $query->on('education_score.user_id', '=', 'users.id')
                ->where('education_score.game_id', 2);
        })
        ->leftJoin('score AS experience_score', function($query){
            $query->on('experience_score.user_id', '=', 'users.id')
                ->where('experience_score.game_id', 3);
        })
        ->groupBy(['users.id', 'users.name'])
        ->select([
            'users.name',
            DB::raw('SUM(education_score.points) AS education_score'),
            DB::raw('SUM(experience_score.points) AS experience_score'),
        ])
        ->get();

должен вернуть

[
    {
        name: "JANE DOE",
        education_score: 70,
        experience_score: 2
    }
]

, вместо этого он возвращает точное значение double

[
    {
        name: "JANE DOE",
        education_score: 140,
        experience_score: 4
    }
]

1 Ответ

0 голосов
/ 10 октября 2018

Вы получаете неверные результаты, потому что вы присоединяетесь к одной и той же таблице дважды.

Используйте другой подход:

return DB::table('users')
    ->where('users.id', 36)
    ->leftJoin('score', 'score.user_id', '=', 'users.id')
    ->groupBy(['users.id', 'users.name'])
    ->select([
        'users.id',
        DB::raw('SUM(IF(score.game_id = 2, score.points, 0)) AS education_score'),
        DB::raw('SUM(IF(score.game_id = 3, score.points, 0)) AS experience_score')
    ])
    ->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...