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?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top