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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top