cakePHP はまりそう?な$this->Model->save() 7

自分がはまっただけですが。
cakePHP の model を使って、
「なんも考えずに」
ループ内で insert を繰り返すとうまく insert されないっていう事象です。

ループで insert

ループでデータを insert していきたいときに
直感でPHPを書くとこんなかんじで
実はこれが上手くいきません。

while(!empty($i)){
$insertData[‘Model’][‘id’] = $i;
$this->Model->save($insertData[‘Model’],false);
$i++;
}

結果はどうなるかというと、ループの最後のデータだけが insert されます。
キャッシュ?とかいろいろ思ったんですが
実は理由は簡単でした。

とりあえず解決方法

これで連続 insert が可能に!

while(!empty($i)){
$insertData[‘Model’][‘id’] = $i;
$this->Model->save($insertData[‘Model’],false);

//これを追記
$this->Model->create();

$i++;
}

理由は簡単

$this->Model->create() の中身はこう。

function create() {
$this->id = false;
unset ($this->data);
$this->data = $this->validationErrors = array();
return true;
}

単純にモデルに insert する際のIDを false にしてるだけです。

どういうことかというと、insert するか update するかは、
保存データ(この場合 $insertData[‘Model’] )
に id データがあるかどうかで判別するわけですが、
その id が一番最初に insert した時にセットしたものが
ずっとループの間使われてしまうわけです。

なので

ループ1回目
->新規IDをセットして insert

ループ2回目以降
->一回目のIDを使用して、そのIDのレコードを update

となってしまい、最後のレコードでデータを上書きして終わりとなってしまうわけです。


->