Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Laravel 5 - Elequent GROUP BY nie działa

Jeśli dobrze rozumiem, chcesz pobrać listę obiektów treści wraz z ich podrzędnymi obiektami treści, prawda?

Najłatwiej to zrobić, tworząc relację rodzic-dziecko w swojej Wymownej Treści model, a następnie użyj go, aby załadować rodziców z dziećmi:

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

Następnie, jeśli chcesz wymienić Treść sprzeciwia się ich sekcji wraz z ich dziećmi i ich sekcjami możesz pobrać dane w ten sposób:

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

$contents będzie zawierać kolekcję wszystkich obiektów Content, które nie mają elementu nadrzędnego. Każdy z obiektów będzie miał $content->dzieci atrybut, który przechowuje kolekcję wszystkich elementów podrzędnych Treść przedmioty. Wszystkie obiekty podrzędne będą również zawierać odniesienie do swojego rodzica w $childContent->rodzic . Zarówno rodzice, jak i dzieci będą mieli odpowiednią sekcję w ->sekcji atrybut.

Jeśli chcesz teraz wyświetlić hierarchię treści w swoim Blade szablon, możesz przekazać zmienną $contents do widoku i wykonać następujące czynności:

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

Zauważyłem, że masz sekwencję pole w Twoim modelu. Zakładam, że chcesz, aby zawartość była posortowana według tego pola. W takim przypadku musisz zmienić sposób pobierania danych:

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Darmowe narzędzie do synchronizacji MySQL

  2. MySqlDb rzuca Operand powinien zawierać 1 kolumnę (kolumny) w instrukcji insert ignore

  3. Ten sam login na 2 stronach internetowych

  4. Błąd składni SQL LIMIT

  5. Błąd:(124, 9) błąd:metoda nie zastępuje ani nie implementuje metody z nadtypu