ansioso por cargar relaciones profundamente anidadas?
Pregunta
Tengo una serie de tablas relacionadas así;
trainers -> hasMany -> programs
programs -> hasMany -> weeks
weeks -> hasMany -> days
days -> hasMany -> sessions
sessions -> hasMany -> phases
phases -> hasMany -> excersises
las relaciones en la dirección opuesta son todas aceptadas para ejercicios de fases que también tienen muchas con una tabla dinámica
Obtener relaciones tan profundas como esta según la documentación funciona bien, obviamente
$programs = $this->program->orderBy('trainerId', 'asc')->take(1)->with('weeks.days')->get();
Necesito poder recuperar el contenido de un programa completo y pensé que podría cargar cada relación anidada de algo como esto.
$programs = $this->program->orderBy('trainerId', 'asc')->take(1)->with('weeks.days', 'weeks.days.sessions')->get();
o
$programs = $this->program->orderBy('trainerId', 'asc')->take(1)->with('weeks.days.sessions')->get();
pero ambos devuelven una FatalErrorException
Llamado al método indefinido iluminar soport fachades session :: newQuery ()
¿Cuál es la forma correcta de hacer esto?
Solución
Según su pregunta, puedo ver que tiene una relación anidada como la siguiente.
programs -> hasMany -> weeks
-----------------------------weeks -> hasMany -> days
----------------------------------------------------days -> hasMany -> sessions
Es muy difícil saber para qué datos se deben cargar days
si no sabemos el weeks
.De manera similar para el sessions
también.Entonces tenemos que cargar el weeks
datos primero luego days
, entonces sessions
.
En la documentación de Laravel, podemos ver que la carga ansiosa utiliza el siguiente enfoque:
select * from books
select * from authors where id in (1, 2, 3, 4, 5, ...)
cargando laravel author
datos basados en books
datos.
http://laravel.com/docs/eloquent#eager-loading
Intenta cargar weeks
primero
$programs = $this->program->orderBy('trainerId', 'asc')
->take(1)
->with('weeks', 'weeks.days', 'weeks.days.sessions')
->get();
o:
Carga perezosa y ansiosa:
$programs = $this->program->orderBy('trainerId', 'asc')->take(1)->get();
$programs->load('weeks', 'weeks.days', 'weeks.days.sessions');
Otros consejos
Así que encontré el problema y podría ayudar a alguien más a que sepa la respuesta.Este hilo me dio el momento de AHA Foros de Laravel
Tengo un modelo llamado Sesión, Laravel usa ese nombre en otro lugar en el marco, Duh, así que cuando intenta llamar a mi modelo, en realidad, llama a la otra clase de sesión desde algún lugar en el marco.Algunas de las soluciones que encontré sugerían espacios de nombres, pero no creo que eso funcione para mí porque la declaración de relación simplemente pasa una cadena con el nombre de la clase al marco.Creo que esto significa que el llamado de la clase ocurre en otros lugares y necesitaría poner el espacio de nombres / usar, corríjame si estoy equivocado, por favor.
De cualquier manera, cambiar la clase de la clase a las sesiones y cambiar las relaciones a la demanda, ha resuelto mi problema.
Espero que esto ayude a otra persona a no desperdiciar 36 horas tratando de resolver esto: P