CakePHP3でsaveで'atomic' => falseでrelation先までまとめて保存する際の返り値に注意
なにこれ
無駄に長いタイトルでございますが、かなり状況が限定的なので。。。
CakePHP3でrelation先もまとめて保存するときってこんな感じで保存ができますよね
$membersTable = TableRegistry::get('Members');
$data = [
'name' => 'name',
'hasone' => [
'name' => 'name'
],
'belongsto' => [
'name' => 'name'
],
'hasmany' => [
[
'name' => 'name'
]
],
];
$memberEntity = $membersTable->newEntity($data);
$result = $membersTable->save($memberEntity);
saveに失敗したとき
saveに失敗したときは$result
ってfalse
ですよね?
普通に考えて・・・
しかしfalse
が返ってこないパターンがありました。
- ベースのテーブルは保存に問題ないデータ
- relation先のデータはバリデーションを通過するデータ
- buildRuleで保存に失敗するデータ
- saveメソッドの
atomic
オプションがfalse
という条件が満たされたとき、$resultはentity
が返ってき、さらに$result->getErrors()
にはエラーメッセージが記載されているという状態になっていました。
コアは、、、追うのめんどくさかったのでもう追ってません。。。バグな気もするけど。。。
とりあえず最新のcakeで実験しても起きたので現状は発生すると考えて間違いないでしょう。
対応策
$memberEntity = $membersTable->newEntity($data);
$result = $membersTable->save($memberEntity, ['atomic' => false]);
if (!$result || $result->getErrors()) {
// save失敗
}
// 成功
みたいな感じで書けばいいんじゃね?