基本上,我有这样一段代码:
$this->ModelName->id = $id;
$this->ModelName->save(
array('ModelName'=>array(
'boolean_column1'=>1,
'boolean_column2'=>0,
'string_column'=>'Some short string[always the same]'
)));
有时这个保存会失败。所以我添加了以下内容:
debug($this->ModelName->validationErrors);
debug($this->ModelName->invalidFields());
结果是:
########## DEBUG ##########
array(
(int) 0 => array()
)
###########################
########## DEBUG ##########
array(
(int) 0 => array()
)
###########################
当我将"validate"参数设置为false时,则不会发生这种情况。我也试过以一种没有'ModelName'键的方式改变保存数组,但它没有帮助。
在这个模型中没有任何beforeSave或afterSave回调,也没有一个$validate设置。在这个调用中有更多的字段被保存,但这是更新数据库表中的现有行。
这是作为一个小时的cron作业的一部分在Queue中循环运行的代码。我在不同的运行中看到不同的行为,这可能是由于其他排队函数改变导致问题的东西,但我没有看到它,而且如果没有可读的错误消息,很难找到。这是在从2.4升级到2.7.0之后开始发生的。
UPDATE 1:好的,所以我已经将Model.php文件更新到未发布的2.8分支中的版本,其中包括对'atomic'的错误修复,现在它正在工作。如果我设法找出导致它的确切原因,我会在这里更新。
好的,所以我从(此时)未发布的2.8分支添加了这个提交,修复了它:
https://github.com/cakephp/cakephp/commit/c6e5026767e07585d43ff63de397535d652c18cc来自提交消息:
修复saveMany &与布尔值相关联。对于非原子,保存包含布尔值模型的操作字段。第一个假值将导致保存中止。这回归在#6947中被引入。而不是检查数据从save()中,我们应该对save()进行布尔强制转换以捕获成功/失败。