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 ......
気をつけないと、意図しないデータを意図しない形で上書きしたりしてデータのロストにつながったりします。気をつけましょう。
参考にして見てください。では。