нетерпеливая загрузка глубоко вложенных отношений?

StackOverflow https://stackoverflow.com//questions/21002737

Вопрос

У меня есть серия таблиц, связанных следующим образом;

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top