2013-03-07 29 views
13

私はLaravelを使用していますが、これはすばらしいですが、データベースに関する問題が残っています。LaravelでDBリレーションシップを連結する方法(複数has_many?)

表1:ページ

id | route | title 

表2:要素

id | page_id | type 

表3:コンテンツ

のは、我々は3つのテーブル、そのように持っているとしましょう

id | element_id | data 

私はそのページIDを持つすべての要素を順番に選択するページを1つ選択したいと思います。各要素に対して、要素IDを持つすべてのコンテンツ行を選択する必要があります。

ロード時に呼び出されたページモデルと、前述のように要素と内容を読み込んで返すページモデルに、スタティックload_by_route($ route)関数が必要です。理想的には、このすべての情報を持つ単一のオブジェクト/配列を返します。

基本的には、has_many()呼び出しを連鎖させて二段階の関係を得る方法がわかりません。

+1

だけですべてのテーブルを結合しておきます。あなたはどんなSQLを試みましたか? – Randy

+3

私はLaravelのEloquentを使ってすべてを書いています。つまり、まっすぐなSQLではなく、http://laravel.com/docs/database/eloquentです。 – 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

ここに注意するだけで、このアプローチは関係をまったく連鎖させません。これは子モデルレコードの読み込みを熱心に行いますが、 'Page'がフェッチされたときにもそれは一連の個別のクエリによって行われます。 – Jason

+0

複数のリレーションシップ([5.3 docs](https://laravel.com/docs/5.3/eloquent-relationships#eager-loading)からの読み込み) - $ books = App \ Book :: with( 'author'、 'パブリッシャー ') - > get(); – kerrin

関連する問題