typicms / nestablecollection
一个扩展 Collection 来处理按照邻接表模型无限嵌套项的 Laravel 扩展包。
Requires
- illuminate/database: ~11.0
- illuminate/support: ~11.0
Requires (Dev)
- illuminate/database: ~11.0
- illuminate/support: ~11.0
- nunomaduro/larastan: ^2.0
- orchestra/testbench: ^7.4
This package is auto-updated.
Last update: 2024-09-17 10:56:58 UTC
README
一个扩展 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 升序排序,然后按照 position 升序排序。
更改子集合的名称
默认情况下,子集合的名称是 items,但你可以通过调用 childrenName($name)
方法来更改它:例如,如果你想让你的子集合命名为 children
$collection->childrenName('children')->nest();
缩进和扁平化列表
listsFlattened()
方法生成一个以 id 作为键和标题作为值的树形扁平列表,非常适合用于 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();