0

我想在 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 的自然关系绑定。

4

0 回答 0