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

CakePHP 3 Tree Behavior - numeric value out of range on save, delete, or move functions

我正在使用 CakePHP 3.0 的树行为,在尝试删除节点时遇到一个有趣的问题。团队下有两种类型的节点——内部节点和外部节点。内部节点是我下方树结构中的团队,我可以完全访问它们;外部节点是我下面的团队,他们有自己的团队,他们已经充实了,因此我无权更改它们(我只有权删除整个 top-level 所有者,但不能修改他们团队的实际结构)。

假设我有这样的结构:

           x
        /  |  \
     * o   o   x            o = internal
      /                     x = external
     o                      * = node I'm trying to delete
    / \
   o   x

我写了一个删除函数来删除团队节点。如果我删除带有星号的节点,我希望它删除它下面的每个节点。当我点击外部节点(底部的 x)时,它应该改为将 parent_id 更改为 null,因为我无权删除其他人的外部团队。

我的逻辑是递归的,基本上在每个 child 下调用自身,逻辑类似于:

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);

同样的问题发生在这里,我遇到了 'numeric value out of range' 问题。我有 运行 $this->recover();在 table 上几次,只是为了确保 table 的左右值都正确,问题仍然存在。

有人知道吗?

好吧,这是当前形式的树行为的一个实现陷阱。为了加快某些操作,它依赖于能够为某些节点设置负值。因此,具有 UNSIGNED 列将无法正常工作。

目前最简单的解决方案是删除 lft 和 right 列中的 UNSIGNED 标志。