web-dev-qa-db-ja.com

Laravel(複数のhas_many?)でDB関係を連鎖させる方法

私はLaravelを使用していますが、これは素晴らしいですが、データベースの問題で立ち往生しています。

次のように、3つのテーブルがあるとします。

表1:ページ

id    |   route   |  title

表2:要素

id    |   page_id   |  type

表3:コンテンツ

id    |   element_id   |  data

ページに対して単一の選択を行い、次にそのページIDを持つすべての要素を選択し、各要素に対して、要素IDを持つすべてのコンテンツ行を選択する必要があります。

ページモデルに静的load_by_route($ route)関数が必要です。この関数は、呼び出されると、ルートを使用してページ情報、および上記の要素とコンテンツをロードして返します。理想的には、このすべての情報を含む単一のオブジェクト/配列を返します。

基本的に、has_many()呼び出しをチェーンして、2レベルの関係を取得する方法がわかりません。

14
Pete

熱心な読み込みを調べてください。これはあなたが望むことをするはずです。

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

31
Collin James

Collin Jamesの回答は、すべてのデータを含む1つのオブジェクトを提供します。ページに属するすべてのcontentsを繰り返し処理したかったので、ここに来ました。このようなコレクションを取得する方法は次のとおりです。

  $page = Page::with('elements.contents.element')->has('elements.contents');

  $contents = [];
  foreach ($page->elements as $element) {
    $contents = $element->contents->merge($temp);
  }

withは、 積極的な読み込みhasコンテンツを含む要素のみを反復処理することを確認します を使用していることを確認します。

各コンテンツ要素から、熱心な読み込みで受け取ったbelongsTo関係から要素情報を取得できます。

class Content extends Eloquent 
{

 public function element()
 {
    returh $this->belongsTo('\App\Page');
 }

}
0
Adam