Мир*_*чев 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)
看起来像: 这个
我正在考虑两种选择:
一些带有递归函数的服务和干净的 php 代码,返回具有完整 HTML 结构的变量(选择 + 选项)并在模板文件中显示该变量。
一些 Laravel 方式,我不知道如何实现。
在您的主刀片模板中,如下所示。在这里,我们首先添加选择框,然后循环遍历类别。如果父类别有子类别,则首先通过调用另一个模板并将子类别数据传递给它来添加子类别。
<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