Se ho capito bene, vorresti recuperare un elenco di oggetti di contenuto insieme ai relativi oggetti di contenuto figli, corretto?
Il modo più semplice per farlo è creare una relazione genitore-figlio nel tuo Contenuto eloquente modello e quindi utilizzalo per caricare i genitori con i bambini:
<?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);
}
}
Quindi, se desideri elencare Contenuto oggetti la loro Sezione insieme ai loro figli e alle loro sezioni, puoi recuperare i dati in questo modo:
$contents = Content::with(['children', 'section', 'children.section'])->whereNull('parent_id')->get();
$contents conterrà una raccolta di tutti gli oggetti Contenuto che non hanno un genitore. Ciascuno degli oggetti avrà un $content->figli attributo che contiene una raccolta di tutti i Contenuti secondari oggetti. Tutti gli oggetti figli conterranno anche un riferimento al loro genitore in $childContent->parent . Sia i genitori che i bambini avranno la loro sezione corrispondente nella ->sezione attributo.
Se desideri visualizzare una gerarchia di contenuti ora nel tuo Blade template, puoi passare la variabile $contents alla vista ed eseguire le seguenti operazioni:
<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>
Ho notato che hai una sequenza campo nel tuo modello. Premetto che vuoi che i contenuti siano ordinati in base a quel campo. In questo caso dovrai modificare il modo in cui recuperi i dati:
$contents = Content::with(['children' => function($builder) {
$builder->orderBy('sequence', 'desc');
}, 'section', 'children.section'])->whereNull('parent_id')->get();