В моем проекте 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)
..., что позволяет возвращать только данные из таблицы уроков. Но действительно ли это нужно?