minh164 / elonest
Laravel 包中的嵌套集模型。
This package is auto-updated.
Last update: 2024-09-27 17:59:18 UTC
README
什么是嵌套集模型?
嵌套集模型是用于在关系数据库中表示嵌套集集合(也称为树或层次结构)的一种技术(如维基百科所述)。
上图是一个具有多级节点的集合,"设备"节点父节点有多个子节点,分别是"手机"、"笔记本电脑",每个节点子节点有多个子节点子节点...每个节点将会有左右值。是的,这就是嵌套集模型!
为什么我们应该使用嵌套集模型?
通常,我们使用递归技术来获取每个级别。例如,在上述设备列表中,要获取"设备"节点的所有子节点,我们必须递归地遍历每个节点以找到其子节点,让我们计算查询总数
- 找到"设备"的子节点("手机"、"笔记本电脑")。
- 找到"手机"的子节点("苹果"、"三星")。
- 找到"苹果"的子节点("iPhone"、"iPhone Pro Max")。
- 找到"三星"的子节点("Note")。
- 找到"Note"的子节点。
- 找到"笔记本电脑"的子节点。
需要六次查询才能获取"设备"的子节点,这似乎不是一个大问题?但让我们想象一下,节点级别增加到100、1000或10,000...我无法计算所需的查询总数 :D。
好吧,我们尝试改为使用嵌套集模型,这个大问题将由此技术解决。再次计算查询次数
- 查找所有左侧大于1且右侧小于22的节点子节点。
- 结束。无需步骤2 :D
我们只使用一个查询即可解决问题,而不是使用递归的太多查询。1是"设备"节点的左侧值,22是右侧值,嵌套集模型将使用这对值通过算法计算一切。
如何使用
扩展 Minh164\EloNest\NestableModel 类以应用于需要嵌套集模型的模型
接下来,你创建一个迁移来为表创建一些必要的列,将这些行添加到新创建的迁移文件中
$table->bigInteger('lft')->index();
$table->bigInteger('rgt')->index();
$table->unsignedMediumInteger('depth')->default(0);
$table->unsignedMediumInteger('parent_id')->default(0)->index();
$table->unsignedMediumInteger('original_number')->comment("Identifier number to determine folders belong together")->index();
CRUD 方法
类似于基本的 Eloquent Model,NestableModel 也具有 Eloquent Builder 类,我们将使用该类中的某些方法来实现 CRUD 逻辑。
创建节点
我们使用 createNode 方法来创建新节点,此方法接受两个参数
data: 新节点所需的信息数组。parentId: 新节点将成为子节点的父节点 ID。如果为 null,则新节点将成为一个新的根节点。
删除节点
我们使用 deleteNodes 方法
移动节点
您使用 moveNode 方法来更改节点位置。
警告:此方法仅更新一条记录,我将稍后更新多条记录。
方法接收两个参数
- previous: 需要移动的位置左侧的值。
- next: 需要移动的位置右侧的值。
注意:previous 和 next 值不是节点的左侧和右侧值,我们应该查看这张图
如果我们想将"苹果"移动到"HP"之前,则 previous 和 next 值传递给 moveNode:14 和 15。
获取节点
我们不会使用 ->get() 方法来获取列表,而是将使用 ->getNodes() 方法返回 NestedCollection 对象,这将帮助您处理复杂的嵌套逻辑
警告:获取一条记录(与->first()相同)将在稍后更新。
获取关系时可能使用with方法,我们还有withNodes来获取所有嵌套节点的关联,并且通过懒加载处理!
在NestableModel中已经为您的模型实现了一些关系,可以使用它。
我们可以同时使用with和withNodes,但with仅获取父节点的关联,不获取嵌套子节点的关联。
是的!我们还可以通过扩展并覆盖抽象类Minh164\EloNest\Relations\NodeRelation中的某些方法来创建一个自定义的节点关系。
正在更新.....











