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?

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top