Treeview 菜单在 Laravel 中呈现两次类别

Treeview menu render twice categories in Laravel

我已经创建了嵌套的树视图类别和子类别,但它似乎渲染了两次类别。

这是我在页面上看到的情况。

Main category 1
  - Sub -category 1.1
  - Sub -category 1.2
Main category 2
  - Sub -category 2.1
  - Sub -category 2.2
Sub -category 1.1
Sub -category 1.2
Sub -category 2.1
Sub -category 2.2

这里发生的事情是首先呈现正确的树视图,然后在下方呈现 sub-categories 作为主要类别。

类别和 sub-categories 保存在一个 table 中,其中我有列 parent_id 0 作为主要类别,如果 sub-category 是 [=31 的 ID =] 代替。这是我的模型

public function parent()
{
    return $this->belongsTo('App\Category');
}

public function children()
{
    return $this->hasMany('App\Category', 'parent_id');
}

控制器

public function index()
{
    $allCategories = Category::with(['children'])->get();     
    return view('categories', compact('allCategories'));
}

和blade

@foreach($allCategories as $category)
  <li class="treeview">
    <a href="{{ $category->id }}">{{ $category->title }}</a>
    <ul class="treeview-menu">
      @foreach($category->children as $subcategory)
        <li class=""><a href="{{$subcategory->id}}">{{$subcategory->title}}</a></li>
      @endforeach
    </ul>
  </li>
@endforeach

这样试试。

型号

public function parent()
{
    return $this->belongsTo('App\Category', 'id', 'parent_id'); // I believe you can use also hasOne().
}

public function children()
{
    return $this->hasMany('App\Category', 'parent_id', 'id');
}
public static function tree() {

    return static::where('parent_id', '=', NULL)->get(); // or based on you question 0?

}

你的控制器

public function index()
{
    $allCategories = Category::tree();     
    return view('categories', compact('allCategories'));
}

还有你的blade观点

@foreach($allCategories as $item)
<li class="treeview">
    <a href="{{ $item->id }}"><i class="fa fa-link"></i> <span>{{ $item->title }}</span> <i class="fa fa-angle-left pull-right"></i></a>
        <ul class="treeview-menu">
            @foreach($item['children'] as $child)
            <li><a href="{{ $child->id }}">{{ $child->title }}</a></li>
            @endforeach
        </ul>
</li>
@endforeach