我想在 Laravel 8 应用程序中使用ClosureTable 。我按照说明进行操作,因此我有两个名为 nodes 和 node_closure 的表,其结构如下,首先是nodes
表:
ID | parent_id | 位置 | 删除_at |
---|---|---|---|
? | ? | ? | ? |
表格如下node_closure
:
闭包ID | 祖先 | 后代 | 深度 |
---|---|---|---|
? | ? | ? | ? |
我在示例中运行了给定的代码:
Node::createFromArray([
[
'id' => 1,
'children' => [
[
'id' => 2,
'childern' => [
['id' => 3],
['id' => 4],
['id' => 5],
]
],
['id' => 3],
]
]
]);
它使用以下数据填充表:
现在当我跑
$children = Node::find(1)->getChildren();
return $tree = $children->toTree();
它给了我:
[
{
"id": 2,
"parent_id": 1,
"position": 0,
"deleted_at": null
},
{
"id": 3,
"parent_id": 1,
"position": 1,
"deleted_at": null
}
]
并运行以下命令:
$children = Node::find(2)->getChildren();
return $tree = $children->toTree();
返回一个空数组[]
(在包的github 页面上的给定示例中,它没有描述或提及在多个节点中使用一个节点,所以我不确定包是否可以实现)
除了这个例子,我还尝试了很多不同的东西,比如
$parent = Node::find(1);
$node = Node::find(2);
$parent->addChild($node);
$node = Node::find(3);
$parent->addChild($node);
接着:
$parent = Node::find(2);
$node = Node::find(3);
$parent->addChild($node);
$node = Node::find(4);
$parent->addChild($node);
$node = Node::find(5);
$parent->addChild($node);
但它没有按预期工作。我所看到的,当我对列运行任何更新以使其成为另一个父节点的子节点时,它只会更新 parent_id 字段,因此失去对先前父子关系的引用,并且节点不再是父节点的子节点。
是否有可能以某种方式实现我想要实现的目标?那就是通过这个模块使“多对多关系”更容易,其中一个节点可以是多个父节点的子节点。
附言。我实际上有一个商家表,我想在其中创建多个商家的商家子商家。如果有人有更好的想法,那就太好了。我只想坚持 Laravel 的自然关系绑定。