私が正しく理解している場合は、コンテンツオブジェクトのリストをその子のコンテンツオブジェクトと一緒に取得しますか?
これを行う最も簡単な方法は、Eloquentコンテンツに親子関係を作成することです。 モデル化してから、それを使用して親に子をロードします:
<?php
class Content extends Model {
public function children() {
//this defines a relation one-to-many using parent_id field as the foreign key
return $this->hasMany(Content::class, 'parent_id');
}
public function parent() {
return $this->belongsTo(Content::class, 'parent_id');
}
public function section() {
return $this->belongsTo(Section::class);
}
}
次に、コンテンツを一覧表示する場合 セクションに反対します 彼らの子供たちと彼らのセクションと一緒に、あなたはそのようなデータをフェッチすることができます:
$contents = Content::with(['children', 'section', 'children.section'])->whereNull('parent_id')->get();
$ contentsには、親を持たないすべてのContentオブジェクトのコレクションが含まれます。各オブジェクトには$content->子があります すべての子のコレクションを保持する属性コンテンツ オブジェクト。すべての子オブジェクトは、 $ childContent-> parentに親への参照も保持します 。親と子の両方が->セクションに対応するセクションを持ちます 属性。
ブレードにコンテンツ階層を表示したい場合 テンプレートの場合、$ contents変数をビューに渡して、次の操作を行うことができます。
<ul>
@foreach($contents as $content)
<li>{{$content->title}}</li>
@if($content->children->count() > 0)
<ul>
@foreach($content->children as $childContent)
<li>{{$childContent->title}}</li>
@endforeach
</ul>
@endif
@endforeach
</ul>
シーケンスがあることに気づきました モデルのフィールド。コンテンツをそのフィールドでソートする必要があると思います。この場合、データの取得方法を変更する必要があります:
$contents = Content::with(['children' => function($builder) {
$builder->orderBy('sequence', 'desc');
}, 'section', 'children.section'])->whereNull('parent_id')->get();