Ошибка SQL CakePHP TreeBehavior::recover()

Поэтому я пытаюсь использовать метод восстановления TreeBehavior, так как думаю, что некоторые из моих данных повреждены. При попытке сделать это я получаю эту ошибку SQL:

Ошибка: SQLSTATE[42000]: Синтаксическая ошибка или нарушение прав доступа: 1064 Ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с «И» в строке 1 SQL-запрос: UPDATE fracmerl_dev.categories AS Category SET Category.lft = Category.lft + 4203 ГДЕ Category.lft МЕЖДУ И

Очевидно, что в запросе отсутствуют некоторые значения. Я также получаю это предупреждение:

Примечание (8): Неопределенное смещение: 0 [CORE/Cake/Model/Behavior/TreeBehavior.php, строка 865]

Это торт версии 2.3.

Редактировать:

Строка 865 в TreeBehavior является последней строкой в ​​этом блоке кода:

        list($node) = array_values($Model->find('first', array(
        'conditions' => array($scope, $Model->escapeField() => $Model->id),
        'fields' => array($Model->primaryKey, $parent, $left, $right),
        'recursive' => $recursive
    ))); //THIS IS LINE 865

Итак, я предполагаю, что возвращаемое значение array_values($Model->find... не имеет смещения 0. Кажется странным, что PHP сообщает мне об ошибке в этой строке, а не в строке 861, но я дважды проверил, и это определенно строка.

Спасибо


person Will    schedule 13.06.2013    source источник
comment
если это версия 2.3 - почему вы пометили ее как cakephp-2.0 :P? строка 865 поведения дерева не указывает на строку кода, которая может привести к ошибке неопределенного смещения. Ошибка неопределенного смещения является ключевой, так как именно отсюда берутся числовые значения для между.   -  person AD7six    schedule 13.06.2013
comment
Ну, 2.0 — ближайший доступный тег :). Я обновил свой вопрос с дополнительной информацией   -  person Will    schedule 13.06.2013
comment
На самом деле похоже, что моя строка 865 отличается от строки по этой ссылке - возможно, я изменил номера строк, пытаясь отладить материал из этого файла. Чтобы было ясно, строка в моем вопросе, прокомментированная ЭТО СТРОКА 865, - это моя строка 865 :)   -  person Will    schedule 13.06.2013
comment
Я думаю, что у вас есть какое-то другое поведение или мешающие функции - этот запрос пытается найти запись, которая была непосредственно перед сохранением, и не находит ее. Посмотрите на создаваемый им SQL-запрос и определите, почему он не находит запись с заданным первичным ключом для продолжения. Поскольку это не вопрос, на который можно просто ответить.   -  person AD7six    schedule 14.06.2013


Ответы (1)


AD7six был прав, но что-то мешало. У меня был обратный вызов beforeFind() в моей модели, который выглядел так:

public function beforeFind($queryData){
    if ((!isset($queryData['exclude']) || $queryData['exclude']) && (empty($queryData['conditions']['Category.id']) || is_array($queryData['conditions']['Category.id']))){
        $queryData['conditions'][] = array('NOT' => array('Category.id' => $this->exclude));
    }
    return $queryData;
}

Этот обратный вызов не позволял TreeBehavior найти элемент, который он хотел найти, чтобы продолжить сортировку данных.

person Will    schedule 17.07.2013