2013-03-07 8 views
13

Ich benutze Laravel, das ist genial, aber ich stecke auf ein Problem mit der Datenbank fest.Wie man DB-Beziehungen in Laravel kettet (multiple has_many?)

Lassen Sie uns sagen, dass wir drei Tabellen haben, etwa so:

TABELLE 1: Seiten

id | route | title 

TABELLE 2: Elemente

id | page_id | type 

TABELLE 3: Inhalt

Ich möchte eine einzelne Auswahl für die Seite treffen, die wiederum alle Elemente mit dieser Seiten-ID auswählt und für jedes der Elemente alle Inhaltszeilen mit der Element-ID auswählt .

Ich möchte Funktion im Seiten Modell eines statischen load_by_route ($ route) haben, die, wenn sie aufgerufen wird, wird die Route mit der Seite Informationen sowie die Elemente und Inhalte wie oben beschrieben zu laden verwenden und zurück. Im Idealfall würde es ein einzelnes Objekt/Array mit all diesen Informationen zurückgeben.

Grundsätzlich bin ich nicht sicher, wie die has_many() Aufrufe zusammen zu ketten, so dass ich die zweistufige Beziehung bekomme.

+1

halten nur alle Tabellen verknüpft. Haben Sie SQL versucht? – Randy

+3

Ich schreibe alles mit Laravels Eloquent: http://laravel.com/docs/database/eloquent, anstelle von straight SQL. – Pete

Antwort

30

Schauen Sie in eifrig laden. Dies sollte tun, was Sie wollen.

class Page extends Eloquent { 

    public function elements() 
    { 
     return $this->has_many('Element'); 
    } 

} 

class Element extends Eloquent { 

    public function contents() 
    { 
     return $this->has_many('Content'); 
    } 

} 

class Content extends Eloquent {} 

$page = Page::with(array('elements', 'elements.contents'))->first(); 

https://laravel.com/docs/master/eloquent-relationships#eager-loading

+0

Super, danke! Ich hatte nicht begriffen, dass dies der Begriff war, nach dem ich suchen musste - ich hatte gerade alle Abschnitte über Beziehungen gelesen. Vielen Dank! – Pete

+1

Nur um hier zu bemerken, verkettet dieser Ansatz Beziehungen überhaupt nicht. Es führt eifriges Laden der Kindmodelldatensätze aus, aber das wird immer noch durch eine Reihe von getrennten Abfragen ausgeführt, wenn die "Page" abgerufen wird. – Jason

+0

Eager Laden mit mehreren Beziehungen (aus [5.3 Dokumente] (https://laravel.com/docs/5.3/eloquent-relationships#eager-loading)) - $ Bücher = App \ Book :: mit ('Autor', ' Herausgeber ') -> get(); – kerrin

Verwandte Themen