нетерпеливая загрузка глубоко вложенных отношений?
Вопрос
У меня есть серия таблиц, связанных следующим образом;
trainers -> hasMany -> programs
programs -> hasMany -> weeks
weeks -> hasMany -> days
days -> hasMany -> sessions
sessions -> hasMany -> phases
phases -> hasMany -> excersises
все отношения в противоположном направлении имеют одно значение для упражнений на фазы, которое также имеет значение hasMany со сводной таблицей.
получение таких отношений на одну глубину в соответствии с документацией, очевидно, работает нормально
$programs = $this->program->orderBy('trainerId', 'asc')->take(1)->with('weeks.days')->get();
Мне нужно иметь возможность получить содержимое всей программы, и я подумал, что могу загружать каждое вложенное отношение примерно так:
$programs = $this->program->orderBy('trainerId', 'asc')->take(1)->with('weeks.days', 'weeks.days.sessions')->get();
или
$programs = $this->program->orderBy('trainerId', 'asc')->take(1)->with('weeks.days.sessions')->get();
но оба возвращают FatalErrorException
Призыв к неопределенному методу осветить поддержка facades session :: newquery ()
как правильно это сделать?
Решение
Из вашего вопроса я вижу, что у вас есть вложенные отношения, подобные следующим.
programs -> hasMany -> weeks
-----------------------------weeks -> hasMany -> days
----------------------------------------------------days -> hasMany -> sessions
Очень сложно понять, какие данные следует загружать. days
если мы не знаем weeks
.Аналогично для sessions
также.Итак, нам нужно загрузить weeks
сначала данные, затем days
, затем sessions
.
Из документации Laravel мы видим, что загрузка Eager использует следующий подход:
select * from books
select * from authors where id in (1, 2, 3, 4, 5, ...)
Загрузка Ларавел author
данные на основе books
данные.
http://laravel.com/docs/eloquent#eager-loading
Попробуйте загрузить weeks
первый
$programs = $this->program->orderBy('trainerId', 'asc')
->take(1)
->with('weeks', 'weeks.days', 'weeks.days.sessions')
->get();
или:
Ленивая нетерпеливая загрузка:
$programs = $this->program->orderBy('trainerId', 'asc')->take(1)->get();
$programs->load('weeks', 'weeks.days', 'weeks.days.sessions');
Другие советы
Итак, я нашел проблему, и это может помочь кому-то еще узнать ответ.Эта тема дала мне аха Moment Maravel Forums
У меня есть модель, называемая сеансом, Larave использует это имя в другом месте в рамках, DUH, поэтому, когда он пытается вызвать мою модель, она фактически вызывает другой класс сеанса от где-то глубоко в рамках.Некоторые из решений, которые я нашел, предлагая пространства имен, но я не думаю, что будет работать для меня, потому что декларация отношений просто передает строку с именем класса в рамках структуры.Я думаю, что это означает, что призвание класса происходит в другом месте, и мне нужно было бы поставить пространство имен / использование там исправить меня, если я ошибаюсь, пожалуйста.
В любом случае изменив класс сеанса на сеансы и изменение отношений в соответствии с удовлетворением мою проблему.
Я надеюсь, что это поможет кому-то еще не тратить 36 часов, пытаясь понять это: P