[CakePHP]saveを連続で実行したとき、データがUPDATEされるのを防ぐ

CakePHPのSaveメソッドを連続実行するときに気をつけることCakePHP2

CakePHPのDB上のデータを新規追加したりするときはsaveメソッドを使うことが多いと思います。便利です。しかし、挙動を理解しておかないと意図しない動きをすることがあります。

対象はCakePHP2系となっています。

■データ新規追加時に連続してsaveを実行すると、2回目以降のsaveはupdateになる

 

以下の様な実装があったとします。$targetDataListに入っている3つのデータを新規にDB上に登録します。モデルに記述しているものとします。

$targetDataList = ['hoge', 'moge', 'hogehoge'];

foreach($targetDataList as $targetData) {
    $insertData = ['data' => $targetData];
    $this->save($insertData, false);
}

saveは合計で3回実行されるのですが、2回目以降の実行はすべてupdateになります。そのため、DB上のデータは以下のようになります。

id   data      created      modified
1    hogehoge  ......

本来であれば、3つのデータ【hoge】と【moge】と【hogehoge】が挿入されていなければいけないのですが、最後の【hogehoge】だけになってしまいます。これは1回目のsaveメソッドでinsert、それ以降のsaveメソッドはすべてupdateとなっているために発生します。

 

これを解消するためには、以下のように都度$this->create();をしてあげると意図したとおり、3つのデータが挿入されます。

$targetDataList = ['hoge', 'moge', 'hogehoge'];

foreach($targetDataList as $targetData) {
    $insertData = ['data' => $targetData];
    $this->create();  // ここが違い。都度create()を実行する。
    $this->save($insertData, false);
}

 

これで、DB上のデータも以下のように正しく挿入されます。

id   data      created      modified
1    hoge      ......
2    moge      ......
3    hogehoge  ......

 

気をつけないと、意図しないデータを意図しない形で上書きしたりしてデータのロストにつながったりします。気をつけましょう。

 

参考にして見てください。では。