2017-06-26 3 views
2

Ich entwickle eine einfache Platform von Schularbeiten. Die plataform haben zwei Tabellen: themes - wo die Themen der einzelnen Jobs gespeichert werdenWie erstellt man eine hierarchische Tabelle mit Laravel?

wird
id 
parent_id 
name 

works - hier werden die Arbeiten der einzelnen Schüler sein

id 
theme_id 
description 

Nun, ich versuche zu machen eine hierarchische Tabelle. Wo jede Reihe das Thema hätte und wenn man die Reihe öffnet, würde es die Werke des Themas zeigen und wenn es ein Kind-Thema gibt, würde es den Link dazu anzeigen ... und so weiter!

Etwas wie folgt aus: hierarchical table

Im Modell, ich habe:

public function childs() { 
    return $this->hasMany(self::class,'parent_id','id') ; 
} 

In meinem Controller (i dies verbessern müssen):

public function index(){ 
    $themes = DB::table('themes', DB::raw('SELECT * WHERE lft IS BETWEEN parent.lft AND parent.rgt'))->get(); 
    $works = Work::all(); 

    $themes = array_map(function($theme){ 
     $theme->works = []; 
     return $theme; 
    }, $themes->toArray()); 

    foreach($themes as $theme){ 
     foreach($works as $work){ 
      if($theme->id === $work->theme_id){ 
       $theme->works[] = $work; 
      } 
     } 
    } 
    return view('dashboard.trabalhos.index', ['themes' => $themes]); 
} 

Die Rückkehr des Reglers Funktion ist:

array:3 [▼ 
    0 => {#275 ▼ 
    +"id": 1 
    +"parent_id": null 
    +"name": "Tema1" 
    +"description": "asdasdasd" 
    +"lft": 1 
    +"rgt": 6 
    +"depth": 0 
    +"created_at": null 
    +"updated_at": null 
    +"works": array:1 [▼ 
     0 => Work {#287 ▶} 
    ] 
    } 
    1 => {#278 ▶} 
    2 => {#279 ▶} 
] 

Und in der Ansicht war mein letzter Test etwas wie folgt aus:

<table id="asd" class="highlight"> 
    <thead> 
    <tr> 
     <th>Tema</th> 
    </tr> 
    </thead> 
    <tbody> 
    @forelse($themes as $theme) 
     @php($asd = $theme->depth) 
     @if($theme->depth === 0) 
      <tr data-tt-id="{{$theme->id}}" class="branch collapsed"> 
       <td> 

        @if(count($theme->works) > 0) 
         <?php 
         foreach($theme->works as $work){ 
          echo "nome: " . $work->title; 
         } 
         ?> 
        @endif 
        {{$theme->name}} 
       </td> 
      </tr> 
     @elseif($theme->depth > 0) 
      <tr data-tt-id="{{$theme->id}}" data-tt-parent-id="{{$theme->parent_id}}" class="branch collapsed" style="display: none;"> 

       <td> 
        {{$theme->name}} 
       </td> 
      </tr> 
     @endif 
    @empty 

    @endforelse 
    <tr></tr> 
    </tbody> 
</table> 

Ich habe versucht bootstrap-treeview und treetable verwenden, aber vielleicht mein Problem ist Logik in Frontend. Könnte mir jemand helfen und mir ein Licht geben?

+0

können Sie zeigen uns etwas von Ihrem Code? – Drudge

+0

Versuchen Sie diese Tutorials http://itsolutionstuff.com/post/laravel-5-category-treeview-hierarchical-structure-example-with-demoexample.html – manjunath

+0

Sie benötigen rekursive Weise –

Antwort

1

Sie können die Komponente "kalnoy/nestedset" ansehen Es ist eine Komponente zum Erstellen von Baumstrukturen und es enthält alle notwendigen Methoden dafür. Wenn Sie es verwenden wird, müssen Sie dieses

Schema::create('items', function (Blueprint $table) { 
    $table->increments('id'); 
    ... 
    NestedSet::columns($table); 
    ... 
}); 

Und Sie können alle Methoden dieser Komponente verwenden, um Baumstrukturen wie diese zu erzeugen angegebenen Spalten zu einer Tabelle hinzuzufügen:

$root = Item::findOrFail($rootId); 
$nodes = $root->descendants->toTree($root); 

$traverse = function ($items, $prefix = '-') use (&$traverse) { 
    $html = ''; 
    foreach ($items as $item) { 
     $html .= ... (html structure) 
     $html .= $traverse($item->children, $prefix . '-'); 
    } 
    return $html; 
}; 

$html .= $traverse($nodes); 
Verwandte Themen