如何在 Laravel 的下拉(选择)菜单中打印无限嵌套类别

Мир*_*чев 1 php laravel laravel-8

我有这张category表:

ID 姓名 父 ID
1 编程 0
2 历史 0
3 PHP 1
4 JavaScript 1
6 世界历史 2
7 jQuery 4
8 阿贾克斯 4
9 欧洲 6
10 美国人 6
16 阿贾克斯嵌套 8

这是我在控制器中获取类别的方法:

$categories = Category::where('parent_id', '=', 0)->with('childs')->get();
Run Code Online (Sandbox Code Playgroud)

型号类别:

class Category extends Model
{
    use HasFactory;

    protected $fillable = ['name'];

    public function user()
    {
        return $this->belongsTo(User::class);
    }

    public function posts()
    {
        return $this->hasMany(Post::class)->orderBy('created_at', 'DESC');
    }

    public function childs()
    {
        return $this->hasMany(Category::class, 'parent_id', 'id');
    }
}
Run Code Online (Sandbox Code Playgroud)

我想输出类别,如下所示:

<select>
<option id="1">Programming</option>
<option id="3">Programming -> PHP</option>
<option id="4">Programming -> Javascript</option>
<option id="7">Programming -> Javascript -> jQuery</option>
<option id="8">Programming -> Javascript -> AJAX</option>
<option id="16">Programming -> Javascript -> AJAX -> ajax nested</option>
<option id="2">History</option>
<option id="6">History -> World history</option>
<option id="9">History -> World history -> Europe</option>
<option id="10">History -> World history -> American</option>
</select>
Run Code Online (Sandbox Code Playgroud)

看起来像: 这个

我正在考虑两种选择:

  1. 一些带有递归函数的服务和干净的 php 代码,返回具有完整 HTML 结构的变量(选择 + 选项)并在模板文件中显示该变量。

  2. 一些 Laravel 方式,我不知道如何实现。

Ahm*_*imi 5

在您的主刀片模板中,如下所示。在这里,我们首先添加选择框,然后循环遍历类别。如果父类别有子类别,则首先通过调用另一个模板并将子类别数据传递给它来添加子类别。

<select name="" id="">     
    @foreach ($categories as $category)
        <option value="{{ $category->id }}">{{ $category->name }}</option>

        @if (count($category->childs) > 0)
            @include('subcategories', ['subcategories' => $category->childs, 'parent' => $category->name])
        @endif

    @endforeach
</select>
Run Code Online (Sandbox Code Playgroud)

现在,我们必须创建子项显示模板。根据我的示例,名称应该是subcategories.blade.php。在子刀片模板中,添加以下内容:

@foreach ($subcategories as $sub)
    <option value="{{ $sub->id }}">{{ $parent}} -> {{ $sub->name }}</option>

    @if (count($sub->childs) > 0)
        @php
            // Creating parents list separated by ->.
            $parents = $parent . '->' . $sub->name;
        @endphp
        @include('subcategories', ['subcategories' => $sub->childs, 'parent' => $parents])
    @endif
@endforeach
Run Code Online (Sandbox Code Playgroud)

在子模板中,只要每个子模板都有其他子模板,我们就会一遍又一遍地递归调用子模板本身。

而且,这是我机器上的结果: https: //ibb.co/ynRB04h