Hatena::ブログ(Diary)

「最果て」の支部 RSSフィード

2007-11-09

cakePHPの$model->saveにおけるUpdateとInsert

cakePHPの$mode->saveで1時間以上ハマってしまった。

$model->saveは挿入データのidがnullならInsert,そうでなければUpdateする仕様になってる。

なので以下のようなコードを書けばレコードが2つInsertされると思って実行してみると。。

 <?php
  $this->Model->save($this->data);     //1つめのレコードInsert
  unset($this->data['Model']['id']);   //unsetでid削除
  $this->Model->save($this->data);   //2つめのレコードInsert
  ?>

レコードが1つしか登録されない。

実行されたSQLをデバッグモードONにしてみてみると、1つめのレコードはInsertされているが

2つのめレコードはInsertされず、1つめのレコードをUpdateしているだけになっていた。

id削除してるのになぜ?


ちなみにunsetの仕様は以下のようになっているのでidはNULLになっているはず。

PHPマニュアル NULL

 特別な NULL 値は、ある変数が値を持たないことを表します。NULL  は、NULL 型の唯一の値です。
 変数は、以下の場合に NULL とみなされます。
 ・定数 NULL が代入されている場合。
 ・まだ値が何も代入されていない場合
 ・unset() されている場合。 


悩んだ挙句,コードを以下のように変更すると2つのレコードを無事Insertできた。

 <?php
  $this->Model->save($this->data);     //1つめのレコードInsert
  //unset($this->data['Model']['id']);
  $this->data['Model']['id'] = NULL ;  //unset使わず、NULLを代入
  $this->Model->save($this->data);   //2つめのレコードInsert
  ?>


なぜこれだと通るのかまだ原因特定はまだできてない。。。


環境
PHP 4.3.9
cakephp 1.1.17.5612

shin31shin31 2007/11/10 11:35 こんにちは。
これはハマリがちな所ですね。

モデルを連続で登録する時はModel#create()を間で使います。

$this->Model->save($this->data);
$this->Model->create(); // <--- ココ
$this->Model->save($this->data);

本文下のソースがなぜokかはModel#save()やModel#set()の
ソースを見ると何か分かるかもしれません。

nori0620nori0620 2007/11/10 23:22 コメントありがとうございます。
連続登録間にModel->createが開かれているのは初めて知りました。
時間があるときにcakePHP自体のソースと実装をじっくり見てみたいと思います。
まずはsaveとset部分を見てますね。アドバイスありがとうございます!

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

Connection: close