如何在Laravel中创建嵌套的类别列表?

X 4*_* IR 7 php nested-lists laravel

如何在Laravel中创建嵌套的类别列表?

我想创建以下示例:

  • --- Php
  • ------ Laravel
  • ---------版本
  • ------------系列
  • --- Python
  • ------ Django
  • --- Ruby
  • ..........

我的表的字段是:

id | name | parent_id
Run Code Online (Sandbox Code Playgroud)

如果我必须在深度上添加另一列到我的表中,请告诉我.

我正在使用以下代码,但我认为它不是创建嵌套列表类别的最佳解决方案,我不能将此函数传递给我的视图:

function rec($id)
{
     $model = Category::find($id);
     foreach ($model->children as $chield) rec($chield->id);
     return $model->all();
}

function main () {
    $models = Category::whereNull('parent_id')->get();
    foreach ($models as $parent) return rec($parent->id);
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*ris 14

你可以做一个自我指涉的模型:

class Category extends Model {

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

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

并建立递归关系:

// recursive, loads all descendants
public function childrenRecursive()
{
   return $this->children()->with('childrenRecursive');
}
Run Code Online (Sandbox Code Playgroud)

并让父母带着他们所有的孩子:

$categories = Category::with('childrenRecursive')->whereNull('parent')->get();
Run Code Online (Sandbox Code Playgroud)

最后,您需要遍历子项,直到子项为空.如果你不小心,肯定会遇到一些性能问题.如果这是一个相当小的数据集,您计划保持这种方式,那么它应该不是问题.如果这将成为一个不断增长的列表,那么有一个root_parent_id或者什么来查询和手动组装树可能是有意义的.