Как написать красноречивое левое соединение с подзапросом? - PullRequest
0 голосов
/ 06 июля 2019

Я хочу написать запрос левого соединения с подзапросом в eloquent.У меня есть две таблицы, уроки и lesson_user.

lesson
lesson_id | name | grade

lesson_user
lesson_id|user_id

Если конкретный ученик участвует в уроке, его идентификатор будет указан в таблице lesson_user.

Я хочу получить все уроки для оценки, и если пользователь участвует в уроке, то с его идентификатором.

Результат будет: для user_id 5 и класса 3

 grade   lesson   user_id
   3      java       5
   3      C++        5
   3      Python    NULL  //He is not participating  

Здесь идентификатор пользователя будет отображаться как параметр, я пробовал это, но не сработало.

public function getAll($grade_id, $user_id)
{
    $lessons = Lesson::where('grade_id', $grade_id);

    if($user_id != null){
        $sub = LessonUser::where('user_id', $user_id);
        $lessons = $lessons->leftJoin(DB::raw("($sub->toSql()) as b"), 'b.lesson_id', '=', 'lesson.id');
     }

     $lessons = $lessons
                  ->select("lesson.id", "lesson.name", "user_id", "grade")
                    ->get();

     return $lessons;
}

PS: Каждый урок имеет оценку.

Редактировать:

вместо подзапроса и кода в блоке if, я изначально использовал этот код.Но это дает неверные результаты.Он возвращает уроки, которые не относятся к классам.

$lessons = $lessons->leftJoin('lesson_user as b', 'b.lesson_id', '=', 'lesson.id');
$lessons = $lessons->where("b.user_id",  $user_id)->orWhereNull("b.user_id");

Спасибо:)

1 Ответ

1 голос
/ 06 июля 2019

Я предложил использовать where('user_id', $user_id) в предложении соединения, что делает запрос более читабельным:

public function getAll($grade_id, $user_id)
{
    return Lesson::query()
        ->leftJoin('lesson_user', function (JoinClause $join) use ($user_id) {
            $join->on('lesson_user.lesson_id', '=', 'lesson.id')
                ->when($user_id !== null, function ($query) use ($user_id) {
                    $query->where('lesson_user.user_id', $user_id);
                });
        })
        ->where('lesson.grade', $grade_id)
        ->select([
            'lesson.id',
            'lesson.name',
            'lesson.grade',
            'lesson_user.user_id',
        ]);
        ->get();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...