Mysql
 sql >> Database >  >> RDS >> Mysql

Laravel 5 - Elequent GROUP BY non riesce

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();