Seo tools

Neo Inspiration

  • Search

    • About Me

      • inspi 改め
        jakk@webアーキテクト(自称)
        php,javascript,seoなど
        得意技は extract();



  • Categories

  • Ranking

  • Comments

  • Others


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

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

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


    Leave a Reply

    2008/11/22 09:22:53