Mysql
 sql >> Base de données >  >> RDS >> Mysql

Laravel 5 - Elequent GROUP BY échoue

Si j'ai bien compris, vous souhaitez récupérer une liste d'objets de contenu avec leurs objets de contenu enfants, n'est-ce pas ?

Le moyen le plus simple de le faire est de créer une relation parent-enfant dans votre Contenu Eloquent modèle, puis utilisez-le pour charger les parents avec les enfants :

<?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);
  }
}

Ensuite, si vous souhaitez répertorier le contenu objets leur Section avec leurs enfants et leurs sections, vous pouvez récupérer les données comme ça :

$contents = Content::with(['children', 'section', 'children.section'])->whereNull('parent_id')->get();

$contents contiendra une collection de tous les objets de contenu qui n'ont pas de parent. Chacun des objets aura un $content->enfants attribut qui contient une collection de tous les enfants Content objets. Tous les objets enfants contiendront également une référence à leur parent dans $childContent->parent . Les parents et les enfants auront leur section correspondante dans ->section attribut.

Si vous vouliez afficher une hiérarchie de contenu maintenant dans votre Blade modèle, vous pouvez transmettre la variable $contents à la vue et procéder comme suit :

<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>  

J'ai remarqué que vous avez une séquence champ dans votre modèle. Je suppose que vous voulez que le contenu soit trié par ce champ. Dans ce cas, vous devrez modifier la façon dont vous récupérez les données :

$contents = Content::with(['children' => function($builder) {
  $builder->orderBy('sequence', 'desc');
}, 'section', 'children.section'])->whereNull('parent_id')->get();