我正在使用CakePHP 3.0的树行为,并在我尝试删除节点时遇到一个有趣的问题。团队下有两种类型的节点 - 内部和外部。内部节点是我下面的树结构中的团队,我可以完全访问;外部节点是我下面的团队,他们有自己的团队,他们已经充实了,因此我没有权限改变他们(我只有权删除整个顶级所有者,但不修改实际结构他们的团队)。
所以,假设我有这样的结构:
x
/ | \
* o o x o = internal
/ x = external
o * = node I'm trying to delete
/ \
o x
我有一个删除功能,我已写入删除团队节点。如果我删除带有星号的节点,我希望它删除它下面的每个节点。当我点击外部节点(底部的x)时,它应该将parent_id更改为null,因为我没有权限删除其他人的外部团队。
我的逻辑是递归的,并且基本上为每个孩子调用自己的逻辑与此类似:
if ($team->external === 1) {
$team->parent_id = null;
$this->save($team);
} else {
$this->delete($team);
}
为了简洁起见,我不会写出整个功能,但是这个功能一直持续到所有节点都被删除为止。不幸的是,当我尝试运行该函数时出现此错误:
"SQLSTATE[22003]: Numeric value out of range: 1690 BIGINT UNSIGNED value is out of range in '((`my_application`.`teams`.`lft` + 1182) * -(1))'"
所以这看起来像lft或rght值(也许)的问题而且我很困惑为什么它会乘以-1 ...无论哪种方式,我都不确定这里是什么情况
当我运行其他功能时,我遇到了同样的问题,比如移动命令。如果我想将用户移到另一个节点下面,我可能会在我的控制器中执行类似的操作:
$team->parent_id = $this->request->data['id']; // let's say it's '21'
$this->Teams->save($team);
同样的问题发生在这里我得到'数值超出范围'的问题。我跑了$ this-> recover();在桌子上几次只是为了确保桌子的lft和rght值都是正确的,问题仍然存在。
有人有任何想法吗?
答案 0 :(得分:1)
嗯,这是当前形式的树行为的实现问题。为了加速某些操作,它依赖于能够为某些节点设置负值。因此,拥有UNSIGNED
列将无法正常运行。
现在最简单的解决方案是删除lft和rght列中的UNSIGNED
标记。