hsharghi/nestablecollection

一个扩展 Collection 来处理遵循邻接列表模型的无限嵌套项目的 Laravel 扩展包。

资助包维护!
typicms

安装: 598

依赖: 0

建议者: 0

安全: 0

星级: 0

观察者: 2

分支: 28

1.1.20 2020-09-20 14:40 UTC

README

Software License

一个扩展 collections 来处理遵循邻接列表模型的嵌套项目的 Laravel 扩展包。

安装

运行 composer require typicms/nestablecollection

用法

模型必须有一个 parent_id 属性

protected $fillable = [
    'parent_id',
    // …
];

并且必须使用以下特性

use TypiCMS\NestableTrait;

现在每次你获取该模型的集合时,它将是一个 TypiCMS\NestableCollection 实例,而不是 Illuminate\Database\Eloquent\Collection

如果你想获得一个按 parent_id 升序排序的模型树,只需在集合上调用 nest 方法

Model::orderBy('parent_id')->get()->nest();

当然,你可能还想有一个位置列。因此,你将不得不首先按 parent_id 升序排序,然后按位置升序排序。

更改子集合名称

默认情况下,子集合的名称为 items,但你可以通过调用 childrenName($name) 方法来更改它:例如,如果你想让子集合命名为 children

$collection->childrenName('children')->nest();

缩进和平坦列表

listsFlattened() 方法将树生成为一个以 id 为键、title 为值的平坦列表,非常适合 select/option,例如

[
    '22' => 'Item 1 Title',
    '10' => '    Child 1 Title',
    '17' => '    Child 2 Title',
    '14' => 'Item 2 Title',
]

要使用它,首先调用 nest() 方法,然后调用 listsFlattened() 方法

Model::orderBy('parent_id')->get()->nest()->listsFlattened();

默认情况下,它将查找一个 title 列。你可以作为第一个参数发送一个自定义列名

Model::orderBy('parent_id')->get()->nest()->listsFlattened('name');

默认情况下使用四个空格进行缩进,要使用自己的缩进,请使用 setIndent() 方法,然后调用 listsFlattened() 方法

Model::orderBy('parent_id')->get()->nest()->setIndent('> ')->listsFlattened();

结果

[
    '22' => 'Item 1 Title',
    '10' => '> Child 1 Title',
    '17' => '> Child 2 Title',
    '14' => 'Item 2 Title',
]

嵌套子树

此包移除了具有缺失祖先的项目,这不允许你嵌套树的一个分支。为了避免这种情况,你可以使用 noCleaning() 方法

Model::orderBy('parent_id')->get()->noCleaning()->nest();