sql >> Base de Datos >  >> RDS >> Mysql

Laravel 5 - Elequent GROUP BY está fallando

Si entiendo correctamente, le gustaría obtener una lista de objetos de contenido junto con sus objetos de contenido secundarios, ¿correcto?

La forma más fácil de hacerlo es crear una relación padre-hijo en su Contenido Eloquent model y luego utilícelo para cargar padres con hijos:

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

Luego, si desea enumerar Contenido objetos su Sección junto con sus hijos y sus secciones, puede obtener los datos así:

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

$contents contendrá una colección de todos los objetos de contenido que no tienen padre. Cada uno de los objetos tendrá un $content->child atributo que contiene una colección de todos los hijos Content objetos. Todos los objetos secundarios también tendrán una referencia a su principal en $childContent->parent . Tanto padres como hijos tendrán su apartado correspondiente en ->sección atributo.

Si desea mostrar alguna jerarquía de contenido ahora en su Blade plantilla, puede pasar la variable $contents a la vista y hacer lo siguiente:

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

Noté que tienes una secuencia campo en su modelo. Supongo que desea que el contenido se ordene por ese campo. En este caso, deberá modificar la forma en que obtiene los datos:

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