eifrig beim Laden tief verschachtelter Beziehungen?
Frage
Ich habe eine Reihe von Tabellen, die so zusammenhängen;
trainers -> hasMany -> programs
programs -> hasMany -> weeks
weeks -> hasMany -> days
days -> hasMany -> sessions
sessions -> hasMany -> phases
phases -> hasMany -> excersises
Die Beziehungen in die entgegengesetzte Richtung sind alle, die man für Übungen zu Phasen akzeptiert, die auch viele mit einer Pivot-Tabelle haben
Offensichtlich funktioniert es gut, solche Beziehungen gemäß der Dokumentation so tief zu knüpfen
$programs = $this->program->orderBy('trainerId', 'asc')->take(1)->with('weeks.days')->get();
Ich muss in der Lage sein, den Inhalt eines gesamten Programms abzurufen, und ich dachte, ich könnte jede verschachtelte Beziehung so laden
$programs = $this->program->orderBy('trainerId', 'asc')->take(1)->with('weeks.days', 'weeks.days.sessions')->get();
oder
$programs = $this->program->orderBy('trainerId', 'asc')->take(1)->with('weeks.days.sessions')->get();
aber beide geben eine FatalErrorException zurück
Rufen Sie zur undefinierten Methode Illuminate Support Facades Session :: NewQuery ()
Wie geht das richtig?
Lösung
Aus Ihrer Frage kann ich ersehen, dass Sie eine verschachtelte Beziehung wie die folgende haben.
programs -> hasMany -> weeks
-----------------------------weeks -> hasMany -> days
----------------------------------------------------days -> hasMany -> sessions
Es ist sehr schwer zu wissen, wofür Daten geladen werden sollen days
wenn wir das nicht wissen weeks
.Ebenso für die sessions
sowie.Also müssen wir das laden weeks
Dann erst die Daten days
, Dann sessions
.
Aus der Laravel-Dokumentation können wir sehen, dass Eager Loading den folgenden Ansatz verwendet:
select * from books
select * from authors where id in (1, 2, 3, 4, 5, ...)
Laravel wird geladen author
Daten basierend auf books
Daten.
http://laravel.com/docs/eloquent#eager-loading
Versuchen Sie zu laden weeks
Erste
$programs = $this->program->orderBy('trainerId', 'asc')
->take(1)
->with('weeks', 'weeks.days', 'weeks.days.sessions')
->get();
oder:
Lazy Eager Loading:
$programs = $this->program->orderBy('trainerId', 'asc')->take(1)->get();
$programs->load('weeks', 'weeks.days', 'weeks.days.sessions');
Andere Tipps
Ich habe also das Problem gefunden und könnte jemand anderem helfen, die Antwort zu kennen.Dieser Thread gab mir den Aha-Moment Larwellenforen
Ich habe ein Modell mit dem Namen Session, Larravel verwendet diesen Namen an anderer Stelle im Rahmen, Duh, also, wenn es versucht, mein Modell anzurufen, eigentlich die andere Sitzungsklasse von irgendwo tief im Rahmen anruft.Einige der Lösungen, die ich gefunden habe, schlägt die Namespaces vor, aber ich glaube nicht, dass das für mich funktionieren wird, weil die Beziehungserklärung einfach eine Zeichenfolge mit dem Klassennamen zum Framework übergibt.Ich denke, das bedeutet, dass der Anruf der Klasse anderswo passiert, und ich müsste den Namespace / Gebrauch dort korrigieren, wenn ich falsch liege, bitte.
Jede Möglichkeit, die Sitzungsklasse an Sitzungen zu ändern und die Beziehungen zum Anzug zu ändern, hat mein Problem gelöst.
Ich hoffe, das hilft jemand anderem nicht, 36 Stunden zu verschwenden, um dies herauszufinden: p