私は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レベルの関係を取得する方法がわかりません。
熱心な読み込みを調べてください。これはあなたが望むことをするはずです。
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
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');
}
}