CakePHP 保存失败并设置了验证错误但为空

Posted

技术标签:

【中文标题】CakePHP 保存失败并设置了验证错误但为空【英文标题】:CakePHP save failing with validation errors set but empty 【发布时间】:2013-07-29 10:17:32 【问题描述】:

我同时使用 TranslateBehavior 和 TreeBehavior 的模型无法保存。我怀疑这与其中一种行为有关。这是输入的数据:

array(
    'Category' => array(
        'id' => '3252',
        'parent_id' => null,
        'sort_order' => '0',
        'name' => array(
            'eng' => 'english name',
            'fra' => 'french name',
            'deu' => 'german name',
            'ita' => 'italian name',
            'spa' => 'spanish name'
        ),
    )
)

$this->Category->validationErrors 是:

array(
    'parent_id' => array(),
    'sort_order' => array()
)

模型中没有定义验证规则。没有定义 beforeSave() 或 beforeValidate() 方法。

我没有在屏幕上看到任何验证错误,尽管所有字段都有红色的“错误”轮廓。

编辑 - 保存操作没有达到 Category::beforeSave()。我创建了该函数,但它没有运行。它一直到 Category::beforeValidate()。

        $validates = $this->Category->validates($this->request->data);
        debug($validates);
        $saved = $this->Category->saveAll($this->request->data);
        debug($saved);

在上面的代码中,$validates 为真,$saved 为假。在上述过程中的任何时候都不会调用 Category beforeSave。调用 saveAll() 时验证似乎失败。我需要使用 saveAll 而不是 save 来一次保存所有翻译(我在其他地方使用另一个没有问题的模型执行此操作)。

【问题讨论】:

它以什么方式失败并出现验证错误(问题表明它没有任何验证错误)? 当我说它“失败并设置了验证错误但为空”时,我的意思是 validationErrors 数组包含元素,但这些元素没有任何消息。抱歉,如果不清楚,已编辑问题以澄清 一个键为空的数组 - 仍然是空的。树行为没有任何验证规则或验证回调,翻译行为 afaik 也没有。我建议找出错误的原因(调试保存方法) - 或者至少显示一些允许重现问题的代码:P. 谢谢 - 我不知道你的意思是如何调试保存方法 - 调试我对 Category::saveAll 的调用只显示“false”。关于如何找到错误原因的任何线索?没有其他错误,警告等。我的理解是它只能是验证或 beforeSave 回调停止保存? saveAll is a function 将其视为任何执行意外操作的方法 - 并对其进行调试(将 debug($foo); 语句放入其中 - 确定它返回 false 的方式/原因)。例如saveAll 中的哪一行实际返回?对于返回结果的方法 - that 函数中的哪一行返回 false?等等。请不要只是回答我的反问——调试并找出答案。祝你好运。 【参考方案1】:

所以,经过一段时间的调试,我发现了问题:

   public $hasMany = array(
      'Category' => array('className' => 'Category', 'foreignKey' => 'parent_id', 'counterCache' => true),
      ...

我不知道我为什么要写这个——我应该知道它会导致问题,我想我是想写的......

     public $hasMany = array(
        'Children' => array('className' => 'Category', 'foreignKey' => 'parent_id', 'counterCache' => true),
        ...

不管怎样,改成后者,这些错误就消失了。

【讨论】:

【参考方案2】:

也许它不喜欢 parent_id 和 sort_order 的 null 和零值?同样在数据库中,它们的字段类型设置为什么?他们允许空值吗?等等。我猜由于模型或父/应用程序模型中没有验证规则,所以它必须是一些默认验证,蛋糕的 lib 链接到数据库/mysql 表本身。所以我会检查类别表结构中的 parent_id 和 sort_order 字段。

【讨论】:

some default validation with cake's lib - 不存在 这些字段确实允许空值并且是 INT。 您是否要从表中删除要翻译的字段?例如,您似乎应该从categories 表中删除name 字段?另外,我假设您通过 cake shell ./cake i18n 初始化 i18n 表

以上是关于CakePHP 保存失败并设置了验证错误但为空的主要内容,如果未能解决你的问题,请参考以下文章

模型返回关系的动态属性但为空关系

CAKEPHP 3 在数据库中保存成功关闭日期后不为空,它具有今天的值

Spring Data JPA 'jpaMappingContext' 错误,IllegalStateException:预期能够解析类型但为空

CakePHP - 当某些字段为空时,防止模型数据保存在 saveMany 调用中

“验证错误:密码不能为空”但表单中没有密码字段

CakePHP 错误:无法配置会话,设置 session.auto_start 失败