CakePHP 3树行为 - 保存,删除或移动函数的数值超出范围

时间:2015-05-18 21:27:28

标签: cakephp tree behavior cakephp-3.0

我正在使用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值都是正确的,问题仍然存在。

有人有任何想法吗?

1 个答案:

答案 0 :(得分:1)

嗯,这是当前形式的树行为的实现问题。为了加速某些操作,它依赖于能够为某些节点设置负值。因此,拥有UNSIGNED列将无法正常运行。

现在最简单的解决方案是删除lft和rght列中的UNSIGNED标记。