2015-05-18 6 views
0

Я работаю с Tree Behavior CakePHP 3.0 и получаю интересную проблему, когда пытаюсь удалить узлы. В команде есть два типа узлов - внутренние и внешние. Внутренние узлы - это команды в древовидной структуре под мной, у меня есть полный доступ; внешние узлы - это команды под мной, у которых есть свои собственные команды, которые они создали, и поэтому у меня нет разрешения на их изменение (у меня есть только разрешение на удаление всего владельца верхнего уровня, но не изменение реальной структуры их команды).CakePHP 3 Tree Behavior - числовое значение вне диапазона при сохранении, удалении или перемещении функций

Так скажем, у меня есть структура, как это:

  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))'" 

Так это выглядит как вопрос с ЯПТ или rght значений (возможно), и я запутался, почему она становится умноженным на - 1 ... в любом случае, я не совсем уверен, что здесь происходит.

У меня такая же проблема, когда я запускаю другие функции, такие как команда перемещения. Если я хочу, чтобы переместить пользователя под другой узел, я мог бы сделать что-то подобное в мой контроллер:

$team->parent_id = $this->request->data['id']; // let's say it's '21' 
$this->Teams->save($team); 

Та же проблема, что здесь происходит, когда я получаю «числовое значение из диапазона» вопрос. Я запустил $ this-> recover(); на столе несколько раз, чтобы убедиться, что значения таблицы и rght таблицы верны, и проблема все еще возникает.

Есть ли у кого-нибудь идеи?

ответ

1

Ну, это реализация getcha для поведения дерева в его текущей форме. Чтобы ускорить некоторые операции, он полагается на возможность устанавливать отрицательные значения для некоторых узлов. Поэтому наличие столбца UNSIGNED будет работать некорректно.

Самое простое решение прямо сейчас - удалить флаг UNSIGNED в столбцах lft и rght.

+0

Perfect. Я внес изменения, и я опубликовал некоторые предлагаемые изменения в документации, чтобы другие пользователи не сталкивались с той же проблемой. –

 Смежные вопросы

  • Нет связанных вопросов^_^