Laravel 5.4 hasManyThrough со вторым локальным ключом - PullRequest
0 голосов
/ 14 мая 2018

Текущее состояние базы данных

User
----
id 
name
UserCourse
----
id
user_id
course_id
Homework
----
id
course_id
name

Подробности: Пользователи могут подписаться на несколько курсов, и их подписка сохраняется в таблице UserCourse.Курсы могут иметь несколько домашних заданий.

Вопрос: кто-то хочет получить доступ ко всем домашним заданиям из всех курсов, на которые подписан пользователь.

Таким образом, у одного пользователя есть много подписок на курсы, и у каждого курса есть много домашних заданий.Таким образом, очевидным решением является использование этого кода из пользовательской модели.

$this->hasManyThough('App\Homework', 'App\UserSubscribedToCourse', 'user_id', 'course_id'),

, но при этом генерируется следующий запрос

select homeworks.*, user_course.user_id from homeworks inner join user_course on user_course.id = homeworks.course_id where user_course.user_id = 51

Как видите, он ложно полагает, что он должен совпадать user_course.id с внешним ключом homeworks.course_id, но правильный localKey должен быть user_course.course_id.

.как я вижу из исходного кода, только localKey для таблицы User может быть указан.

Это было исправлено в laravel 5.5 с помощью этого запроса на извлечение: https://github.com/laravel/framework/pull/19114

Есть ли способвыполнить это в Laravel 5.4?

1 Ответ

0 голосов
/ 14 мая 2018

Доступ ко всем домашним заданиям из всех курсов, на которые подписан пользователь.

Получить все курсы, на которые подписан пользователь

$user_id = Auth::user()->id;
$courses = UserCourse::where('user_id', $user_id)->pluck('course_id');

Получить все домашние задания с курсов

$homework = Homework::whereIn('course_id', $courses)->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...