【问题标题】:CakePHP TreeBehavior::recover() SQL errorCakePHP TreeBehavior::recover() SQL 错误
【发布时间】:2013-07-17 22:19:11
【问题描述】:

所以我尝试使用 TreeBehavior 的恢复方法,因为我认为我的一些数据已损坏。尝试执行此操作时,我收到此 SQL 错误:

错误:SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“AND”附近使用正确的语法 SQL 查询:UPDATE fracmerl_dev.categories AS Category SET Category.lft = Category.lft + 4203 其中Category.lft BETWEEN AND

显然查询缺少一些值。我也收到此警告:

注意 (8):未定义偏移量:0 [CORE/Cake/Model/Behavior/TreeBehavior.php,第 865 行]

这是 Cake 2.3 版。

编辑:

TreeBehavior 中的第 865 行是这段代码的最后一行:

        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 行似乎很奇怪,但我已经仔细检查过,这绝对是行。

谢谢

【问题讨论】:

  • 如果它是 2.3 版 - 你为什么要标记它 cakephp-2.0 :P?树行为does not point at a line of code which can produce the undefined offset error 的第 865 行。未定义的偏移误差是关键,因为这就是中间值的来源。
  • 嗯,2.0 是最接近的可用标签 :)。我已经用更多信息更新了我的问题
  • 实际上,我的第 865 行似乎与该链接上的不同 - 我可能通过尝试从该文件中调试内容来更改行号。需要明确的是,我的问题中评论“这是第 865 行”的行是我的第 865 行:)
  • 我认为您遇到了一些其他行为或功能干扰 - 该查询正在尝试查找之前立即保存但未找到的记录。查看它正在生成的 sql 查询并确定它为什么找不到具有给定主键的记录以继续。因为这不是一个可以简单回答的问题。

标签: cakephp tree cakephp-2.3


【解决方案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 找到它想要找到的项目以进行数据整理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-24
    • 2012-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多