carico desideroso relazioni profondamente nidificate?
Domanda
Ho una serie di tabelle correlate in questo modo;
trainers -> hasMany -> programs
programs -> hasMany -> weeks
weeks -> hasMany -> days
days -> hasMany -> sessions
sessions -> hasMany -> phases
phases -> hasMany -> excersises
le relazioni nella direzione opposta sono tutte ha una accetta per excersises a fasi che è anche hasMany con una tabella pivot
ottenere relazioni profonde come questa per la documentazione funziona bene ovviamente
$programs = $this->program->orderBy('trainerId', 'asc')->take(1)->with('weeks.days')->get();
Ho bisogno di essere in grado di recuperare il contenuto di un intero programma e ho pensato che avrei potuto caricare ogni relazione nidificata qualcosa del genere
$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();
ma entrambi restituiscono una FatalErrorException
Chiamata al metodo non definito Illuminate \ Support \ Facades \ Session::newQuery()
qual è il modo corretto per farlo?
Soluzione
Dalla tua domanda, posso vedere che hai una relazione annidata come la seguente.
programs -> hasMany -> weeks
-----------------------------weeks -> hasMany -> days
----------------------------------------------------days -> hasMany -> sessions
È molto difficile sapere per quali dati dovrebbero essere caricati days
se non conosciamo il weeks
.Allo stesso modo per il sessions
così.Quindi, dobbiamo caricare il weeks
prima i dati poi days
, poi sessions
.
Dalla documentazione Laravel, possiamo vedere, Carico desideroso utilizzando il seguente approccio:
select * from books
select * from authors where id in (1, 2, 3, 4, 5, ...)
Laravel caricamento in corso author
dati basati su books
dati.
http://laravel.com/docs/eloquent#eager-loading
Prova a caricare weeks
prima
$programs = $this->program->orderBy('trainerId', 'asc')
->take(1)
->with('weeks', 'weeks.days', 'weeks.days.sessions')
->get();
o:
Pigro desideroso di caricamento:
$programs = $this->program->orderBy('trainerId', 'asc')->take(1)->get();
$programs->load('weeks', 'weeks.days', 'weeks.days.sessions');
Altri suggerimenti
Quindi ho trovato il problema e potrebbe aiutare qualcun altro a conoscere la risposta.Questo thread mi ha dato il momento Aha Laravel forums
Ho un modello chiamato Session, La Laravel usa quel nome altrove nel framework, Duh, quindi quando cerca di chiamare il mio modello in realtà chiamando l'altra classe di sessione da qualche parte nel profondo del quadro.Alcune delle soluzioni che ho trovato suggeriscono i nomi spazi ma non penso che funzionerà per me perché la dichiarazione delle relazioni passa semplicemente una stringa con il nome della classe al framework.Penso che questo significhi che la chiamata della classe avviene altrove e avrei bisogno di mettere lo spazio dei nomi / utilizzare lì correggimi se sbaglio per favore.
Ad entrambi i modi di modificare la classe di sessione in sessioni e modificare le relazioni in base alle quali ha risolto il mio problema.
Spero che questo aiuti qualcun altro non sprecare 36 ore cercando di capirlo: P