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

自分がはまっただけですが。
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

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

4 thoughts on “cakePHP はまりそう?な$this->Model->save()

  1. Reply yasu 1月 29, 2011 11:24 AM

    同じところではまってました。
    この記事を読んで無事解決しました。
    ありがとう

  2. Reply admin 2月 1, 2011 10:24 AM

    記事の情報は1.1系ですが、まだ対応できるようですね。
    参考になってよかったです。

  3. Reply 検索からきました 12月 7, 2013 7:59 AM

    わたしも、同じ場所でハマっていました
    有用な情報をありがとうございます!

  4. Reply Jakk 12月 10, 2013 4:16 PM

    コメントありがとうございます。
    お役にたてれば幸いです。

Leave a Reply