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

Laravel 5 - Elequent GROUP BY fejler

Hvis jeg forstår det rigtigt, vil du gerne hente en liste over indholdsobjekter sammen med deres underordnede indholdsobjekter, ikke?

Den nemmeste måde at gøre det på er at skabe en forældre-barn-relation i dit veltalende indhold model og derefter bruge den til at indlæse forældre med børn:

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

Hvis du derefter vil have en liste over Indhold gør indsigelse mod deres sektion sammen med deres børn og deres sektioner kan du hente data sådan:

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

$contents vil indeholde en samling af alle indholdsobjekter, der ikke har nogen forælder. Hvert af objekterne vil have et $content->børn attribut, der indeholder en samling af alle børns indhold genstande. Alle underordnede objekter vil også indeholde en reference til deres forælder i $childContent->forælder . Både forældre og børn vil have deres tilsvarende sektion i ->sektion attribut.

Hvis du ville vise noget indholdshierarki nu i dit blad skabelon, kan du videregive variabelen $contents til visningen og gøre følgende:

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

Jeg har bemærket, at du har en sekvens felt i din model. Jeg går ud fra, at du ønsker, at indhold skal sorteres efter det felt. I dette tilfælde skal du ændre den måde, du henter dataene på:

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



  1. Hurtigste metode til at tage MySQL Backup and Restore

  2. Hvordan bruger du variabler i et simpelt PostgreSQL-script?

  3. SQL-forespørgsel fra at få SubChild til Child til Parent-tabeller

  4. The Performance Tuning Maze