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:预期能够解析类型但为空