Из локальной области Eloquent возвращен неверный идентификатор - PullRequest
0 голосов
/ 15 апреля 2020

В моем проекте Laravel у меня есть модель (и базовая таблица) для уроков. Сейчас я пытаюсь написать локальную область видимости для возврата всех уроков, которые были закончены конкретным пользователем. Определение «готово» состоит в том, что в таблице существует строка с именем «lesson_results» с идентификатором этого урока и идентификатором пользователя.

Моя область действия в настоящее время выглядит следующим образом:

public function scopeFinished($query, User $user)
{
    return $query->join('lesson_results', function($join) use($user)
        {
            $join->on('lesson_results.lesson_id', '=', 'lessons.id')
            ->where("user_id", $user->id);
        });
}

Это вроде работает. Когда я делаю урок :: закончено ($ user) -> get (), я получаю правильные уроки для этого пользователя. Однако уроки в возвращенной коллекции имеют неправильные идентификаторы! Я вижу идентификаторы из таблицы lesson_results. Поэтому, когда я проверяю $ lesson-> id из одного из возвращенных предметов, я не получаю идентификатор этого урока, но идентификатор соответствующей строки в таблице lesson_results.

Я зарегистрировался mysql и полный запрос, отправленный с Laravel, выглядит следующим образом:

select * from `lessons` inner join `lesson_results` on `lesson_results`.`lesson_id` = `lessons`.`id` and `user_id` = 53

Этот запрос возвращает два столбца с именем id (один из таблицы уроков и один из таблицы lesson_results), и кажется, что Laravel использует неправильный результат для возвращенного результата.

Я не знаю, правильно ли я поступаю по этому поводу или это где-то ошибка?

Это включено Laravel 7.6.1.

edit: Хорошо, я думаю, что я действительно решил это сейчас. Не совсем уверен, если это реальное решение или просто обходной путь. Я добавил вызов select (), чтобы возвращаемая строка теперь была

return $query->select('lessons.*')->join('lesson_results', function($join) use($user)

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

1 Ответ

0 голосов
/ 15 апреля 2020

Одно и то же имя столбца будет закрыто другим.

Решение 1:

Укажите таблицу со столбцом и укажите псевдоним столбца другой таблицы, если он имеет такое же имя столбца.

Lesson::finished($user)->select('lessons.*', 'lesson_results.id AS lesson_result_id', 'lesson_results.column1', 'lesson_results.column2',...)->get();

Решение 2:

Или вы можете использовать Eloquent-Builder с готовностью загружать whereHas, (Предполагая, что вы построили отношения между моделью Lesson и моделью LessonResult)

public function scopeFinished($query, User $user)
{
    return $query->whereHas('lessonResults', function($query) use($user)
        {
            $query->where("user_id", $user->id);
        });
}

Таким образом, вы можете получить такой урок, как это:

Lesson::finished($user)->get();
...