Laravel一列排序1列和不定式嵌套


Laravel one column sorting 1 column and infinitive nesting

我有类别、子类别、子类别的类别,它们都在一个表中。表看起来像这样

$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();
控制器

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

  @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

我给孩子们标记了我想让他们的子类别和类别去的地方。

假设您已经定义了关系:

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

你可以调用这个视图为

// 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'));
}

父视图:

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

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

(更新)在

解释

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

你知道什么是急加载吧?基本上,我想要的是从数据库中预取所有嵌套的项目,直到选定的级别。所以,如果你做->with('children'),它会得到项目和他们的直接孩子。如果你做->with('children.children'),它将得到顶级项目和2级儿童。

那么,分解一下:

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