我有类别、子类别、子类别的类别,它们都在一个表中。表看起来像这样
$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'