LoginSignup
1
2

More than 5 years have passed since last update.

CakePHP3でsaveで'atomic' => falseでrelation先までまとめて保存する際の返り値に注意

Last updated at Posted at 2018-08-28

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失敗
}
// 成功

みたいな感じで書けばいいんじゃね?

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2