Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Laravel 5 - Elequent GROUP BY schlägt fehl

Wenn ich das richtig verstehe, möchten Sie eine Liste von Inhaltsobjekten zusammen mit ihren untergeordneten Inhaltsobjekten abrufen, richtig?

Am einfachsten geht das, indem Sie in Ihrem Eloquent Content eine Eltern-Kind-Beziehung erstellen Modell und verwenden Sie es dann, um Eltern mit Kindern zu laden:

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

Dann, wenn Sie Content auflisten möchten Objekte ihren Abschnitt Zusammen mit ihren Kindern und ihren Sektionen können Sie die Daten so abrufen:

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

$contents enthält eine Sammlung aller Inhaltsobjekte, die keine Eltern haben. Jedes der Objekte hat $content->Kindobjekte Attribut, das eine Sammlung aller untergeordneten Content enthält Objekte. Alle untergeordneten Objekte enthalten auch einen Verweis auf ihre übergeordneten Objekte in $childContent->parent . Sowohl Eltern als auch Kinder haben ihren entsprechenden Abschnitt in ->Abschnitt Attribut.

Wenn Sie jetzt eine Inhaltshierarchie in Ihrem Blade anzeigen möchten Template können Sie die $contents-Variable an die Ansicht übergeben und Folgendes tun:

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

Mir ist aufgefallen, dass Sie eine Sequenz haben Feld in Ihrem Modell. Ich gehe davon aus, dass Sie möchten, dass der Inhalt nach diesem Feld sortiert wird. In diesem Fall müssen Sie die Art und Weise ändern, wie Sie die Daten abrufen:

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