2013-03-07 1 views
13

Я использую Laravel, что является удивительным, но я застрял в проблеме с базой данных.Как связать отношения DB в Laravel (несколько has_many?)

Скажем, у нас есть три таблицы, например, так:

ТАБЛИЦА 1: страницы

id | route | title 

ТАБЛИЦА 2: элементы

id | page_id | type 

ТАБЛИЦА 3: содержание

id | element_id | data 

Я хотел бы сделать один выбор для страницы, которая, в свою очередь, выберет все элементы с этим идентификатором страницы, и для каждого из элементов он должен выбрать все строки содержимого с идентификатором элемента ,

Я хочу иметь статический load_by_route ($ маршрутного) функции в модели страницы, что при вызове будет использовать маршрут для загрузки и вернуть данные страницы, а также элементы и содержание, как описано выше. В идеале он возвратил бы один объект/массив со всей этой информацией.

В принципе, я не уверен, как связать вызовы has_many(), чтобы получить двухуровневые отношения.

+1

просто держать объединения всех таблиц. вы пытались использовать SQL? – Randy

+3

Я пишу все это, используя Larvel's Eloquent: http://laravel.com/docs/database/eloquent, а не прямой SQL. – Pete

ответ

30

Загляните в надежную загрузку. Это должно делать то, что вы хотите.

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

Удивительный, спасибо! Я не понимал, что это тот термин, который мне нужно искать - я просто читал все разделы о взаимоотношениях. Благодаря! – Pete

+1

Как раз отметить здесь, этот подход не связывает отношения вообще. Он действительно загружает записи дочерних моделей, но это все еще выполняется с помощью серии отдельных запросов, когда вызывается «Страница». – Jason

+0

Яркая загрузка с несколькими отношениями (из [5.3 docs] (https://laravel.com/docs/5.3/eloquent-relationships#eager-loading)) - $ books = App \ Book :: with ('author', ' издатель ') -> получить(); – kerrin

 Смежные вопросы

  • Нет связанных вопросов^_^