2016-08-18 2 views
0

Ich habe Kategorien, Unterkategorien, Kategorien von Unterkategorien, die alle in einer Tabelle sind. Tabelle sieht wie folgt ausLaravel 1 Spalte Sortierung 1 Spalte und Infinitiv Verschachtelung

$table->increments('id'); 
$table->integer('parent_id')->nullable()->unsigned()->default(NULL); 
$table->foreign('parent_id')->references('id')->on('categories')- >onDelete('cascade'); 
$table->string('name'); 
$table->timestamps(); 

Controller

$projects = Projects::pluck('post','parent_id'); 

Ansicht

@if (count($projects) > 0) 
    <ul> 
     @foreach ($projects as $project) 
     @include('partials.project', $project) 
     @endforeach 
    </ul> 
    @endif 

partials.project

<li>{{ $project['name'] }}</li> 
    @if (count($project['children']) > 0) 
    <ul> 
     @foreach($project['children'] as $project) 
     @include('partials.project', $project) 
     @endforeach 
    </ul> 
    @endif 

ich Kinder markiert, wo ich möchte, dass Unterkategorien und Kategorien von ihnen gehen. Wie kann ich das durchziehen

+0

einen Blick auf https://github.com/etrepat/baum hat, halte ich es für Ihr Problem lösen soll, und es hat auch eine schöne Beschreibung, wie es funktioniert genau. Es würde jedoch eine etwas andere Struktur auf Ihrem Tisch erfordern. – user3158900

Antwort

2

Vorausgesetzt, dass Sie die Beziehung definiert haben:

// Project.php 
public function children() 
{ 
    return $this->hasMany(self::class, 'parent_id'); 
} 

Sie die Ansicht wie

// ProjectController.php 
public function showNested() 
{ 
    $max_level = 3; // the max nesting level you will support 

    $eager_load = implode('.', array_map(function() { return 'children'; }, range(1, $max_level))); 

    $projects = Project::where('parent_id', null)->with($eager_load)->get(); 

    return view('projects', compact('projects', 'max_level')); 
} 

Elternansicht aufrufen können:

// projects.blade.php 
<ul> 
    @foreach($projects as $project) 
     @include('partials.project', [ 
      'project' => $project, 
      'level' => 1, 
      'max_level' => $max_level 
     ]) 
    @endforeach 
</ul> 

Teilansicht:

// partials/project.blade.php 
<li>{{ $project->name }}</li> 

@if ($level < $max_level && $project->children->count()) 
    <ul> 
     @foreach($project->children as $child) 
      @include('partials.project', [ 
       'project' => $child, 
       'level' => $level + 1, 
       'max_level' => $max_level 
      ]) 
     @endforeach 
    </ul> 
@endif 

(Update)

Erläuterung zu

$eager_load = implode('.', array_map(function() { return 'children'; }, range(1, $max_level)));

Sie wissen, was eifrig Laden ist, nicht wahr? Grundsätzlich wollte ich alle geschachtelten Projekte bis zur ausgewählten Ebene aus der Datenbank abholen. Also, wenn Sie ->with('children') tun, wird es die Projekte und ihre direkten Kinder bekommen. Wenn Sie ->with('children.children') tun, erhalten Sie die Top-Level-Projekte und 2 Ebenen von Kindern.

Also, es brechen:

$max_level = 3; 
// variable 

range(1, $max_level); 
// gives [1, 2, 3] 

array_map(
    function() { return 'children'; }, 
    range(1, $max_level) 
); 
// gives ['children', 'children', 'children'] 

implode('.', array_map(function() { return 'children'; }, range(1, $max_level))); 
// gives 'children.children.children' 
+0

danke es funktioniert. Wenn es kein Problem ist, können Sie diese Codezeile "implode ('.', array_map (function() {return 'children';}, range (0, $ max_level - 1))) erklären;" . – OunknownO

+1

@OunknownO sicher, aktualisiert in Antwort – alepeino

+1

Vielen Dank für die Erklärung, es wird große Hilfe in der Zukunft sein – OunknownO

Verwandte Themen