自分がはまっただけですが。
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
となってしまい、最後のレコードでデータを上書きして終わりとなってしまうわけです。