2013-03-07 10 views
13

Używam Laravel, co jest niesamowite, ale utknąłem na problem z bazą danych.Jak łańcuch relacji DB w Laravel (multiple has_many?)

Powiedzmy, że mamy trzy tabele, jak w przykładzie:

Tabela 1: strony

id | route | title 

Tabela 2: Elementy

id | page_id | type 

Tabela 3: Zawartość

id | element_id | data 

Chciałbym zrobić pojedynczą selekcję dla strony, która z kolei wybierze wszystkie elementy o tym id strony, a dla każdego elementu powinna wybrać wszystkie wiersze zawartości z identyfikatorem elementu .

Chcę mieć statyczny load_by_route ($ route) funkcję w modelu strony, która, kiedy nazywa, będzie korzystać z trasy, aby załadować i powrót Strona informacyjna, a także elementy i treści, jak opisano powyżej. Najlepiej byłoby zwrócić pojedynczy obiekt/tablicę z wszystkimi tymi informacjami.

Zasadniczo nie jestem pewien, jak powiązać połączenia has_many(), aby uzyskać dwu poziomową relację.

+1

prostu zachować łączącą wszystkie tabele. czy próbowałeś jakiegokolwiek SQL? – Randy

+3

Piszę to wszystko za pomocą Eloquent Laravel: http://laravel.com/docs/database/eloquent, a nie prosto SQL. – Pete

Odpowiedz

30

Spójrz w upragnione ładowanie. To powinno robić, co chcesz.

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

Niesamowite, dzięki! Nie zdawałem sobie sprawy, że jest to termin, którego potrzebowałem szukać - czytałem po prostu wszystkie sekcje dotyczące relacji. Dzięki! – Pete

+1

Należy zauważyć, że to podejście nie łączy w ogóle wszystkich relacji. Ma ochotę ładować rekordy modelu potomnego, ale wciąż jest to wykonywane przez serię oddzielnych zapytań, gdy pobierana jest strona "Strona". – Jason

+0

Chętne ładowanie z wieloma relacjami (od [5.3 docs] (https://laravel.com/docs/5.3/eloquent-relationships#eager-loading)) - $ books = App \ Book :: with ('author', ' wydawca ") -> get(); – kerrin

Powiązane problemy