【问题标题】:How to print infinity nested categories in dropdown (select) menu in Laravel如何在 Laravel 的下拉(选择)菜单中打印无限嵌套类别
【发布时间】:2021-04-29 14:00:31
【问题描述】:

我有这个category 表:

id name parent_id
1 Programming 0
2 History 0
3 PHP 1
4 Javascript 1
6 World history 2
7 jQuery 4
8 AJAX 4
9 Europe 6
10 American 6
16 ajax nested 8

这是我在 controller 中获取类别的方法:

$categories = Category::where('parent_id', '=', 0)->with('childs')->get();

型号类别:

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

我想输出类别,像这样:

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

看起来像: this

我正在考虑两种选择:

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

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

【问题讨论】:

  • 这是我对类似问题的回答。 stackoverflow.com/a/65635958/7181149
  • 虽然我只是将它们显示在列表中。
  • @AhmadKarimi 有趣的是,您可以在关卡模板上进行操作。我做了一些类似的事情来在下拉菜单中呈现它们,它工作正常 - imgur.com/a/Dt3T7zQ 我尝试做类似的事情和选择标签(模板的递归调用),但现在无法处理。
  • 所以您只在将它们放入选择框时遇到问题是吗?
  • @AhmadKarimi 这就是我为菜单做的方式,类似于你的回答-pastebin.com/erDkMWZ9我不知道如何处理它们之间的箭头

标签: php laravel laravel-8


【解决方案1】:

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

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

现在,我们必须创建子显示模板。根据我的示例,名称应该是 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

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

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

【讨论】:

  • 我没有看到您的图片有任何问题。
  • 如果您能将此标记为已接受的答案,我将不胜感激:)
  • 你说得对,是我的错。当我获得 15 个代表时,我会回来并投票。
猜你喜欢
  • 2019-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
  • 1970-01-01
  • 2014-07-04
  • 1970-01-01
  • 2013-12-03
相关资源
最近更新 更多