Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 改变孩子的位置后,条令树变得杂乱无章_Php_Symfony_Doctrine Orm - Fatal编程技术网

Php 改变孩子的位置后,条令树变得杂乱无章

Php 改变孩子的位置后,条令树变得杂乱无章,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,当我创建三层嵌套树(只有三个实体)时,如下所示: 1 (lft 1, rgt:6) -2 (lft 2, rgt:5) -3 (lft 3, rgt:4) 1 ( lft:-4, rgt:6 ) -3 (lft: 5, rgt:6) -2 (lft 7, rgt:5) 然后我尝试将节点(id=3,即)从第三级移动到第二级,比如说第二个子级,代码如下: /* this line can be commented - it doesn't work with it either */

当我创建三层嵌套树(只有三个实体)时,如下所示:

1 (lft 1, rgt:6)
 -2 (lft 2, rgt:5)
   -3 (lft 3, rgt:4)
1 ( lft:-4, rgt:6 )
 -3 (lft: 5, rgt:6)
 -2 (lft 7, rgt:5)
然后我尝试将节点(id=3,即)从第三级移动到第二级,比如说第二个子级,代码如下:

/* this line can be commented - it doesn't work with it either */ $chapter->setParent($parentEntity);
$repo->persistAsFirstChildOf($chapter, $parentEntity);
$repo->moveDown($chapter, 1);
因此,我得到了这样的树:

1 (lft 1, rgt:6)
 -2 (lft 2, rgt:5)
   -3 (lft 3, rgt:4)
1 ( lft:-4, rgt:6 )
 -3 (lft: 5, rgt:6)
 -2 (lft 7, rgt:5)
与此相反:

1 (lft 1, rgt:6)
 -2 (lft 2, rgt:5)
 -3 (lft 3, rgt:4)

应该成为第二顺位的孩子会成为第一顺位的孩子。如您所见,lft值不正确。我遗漏了什么吗?

你在那里其实很好

我认为左/右值在这里并不重要,因为您的订单仍然可以

你的问题是你打电话

$repo->moveDown($chapter, 1);
此功能将使您的
$chapter
移动到下一个位置(本例中的第二个位置)

删除对moveDown的调用,然后重试

就lft和rgt属性而言,添加/删除节点可能会重新计算它们

如果这对你来说真的很重要,那么试着打电话(我对此并不担心):


您应该通过gedmo TreeListener更新节点并设置新的父节点(通过NestedTreeRepository->listener获取):


事实上,伙计们,我选择了坏树型如果您想经常更改子项位置,请不要使用嵌套

嗯,我不好,我拿错了订单,正如我提到的。相反,id为3的实体进入第二个位置,它位于第一个位置。我调用moveDown()移动到下一个位置。也许我没有说清楚,对不起。“或者”指的是setParent | | moveDown或setNewParent&&setParent | moveDown?我现在无法检查代码是否正确。@嗯,我已经更新了“示例代码”。现在应该更清楚了。
//set as first child of a new parent - Tree hierarchy, it doesn't touch ORM relation
$repo->setNewParent($node, $newParent);
//set new parent and save. It updates ORM relation only, doesn't touch Tree hierarchy
$node->setParent($newParent);
$entityProvider->save($node); // or $entityManager->flush()
//additionaly move it down
if ($yourCondition) {
    $result = $repo->moveDown($node, $position);
}