CakePHP2 で普通の update がしたいなら updateAll !

あっ、普通の update というのは、WHERE 区に自由な条件をつける、という意味です。今回、CakePHP2 にて次のことをやってみたのでメモします。

  • 好きな条件でテーブルを更新する。
  • あるカラムの値をインクリメントしたい。
  • updateAll だと modifiedを自動で更新してくれないのをなんとかする。
続きでズバッと解決します。

こんな感じでズバッと解決です。

$this->User->updateAll(
		array(
				'User.checked_count' => '`User`.`checked_count` + 1',
				'User.modified' => "'" . date('Y-m-d H:i:s') . "'"
		),
		array(
				'User.username' => $username,
		)
);
  • updateAll の第1引数は更新対象カラムとその値、第2引数は更新条件
  • MySQL でカラムの値をインクリメントするには、更新後の値として「columnname + 1」というように指定すればよいです。つまり、「UPDATE testtalble SET columnname = columnname + 1 WHERE id = 1;」という形です。
  • updateAll は指定したカラム以外は全く更新しない、という仕様ですので modified も更新するには「’User.modified’ => “‘” . date(‘Y-m-d H:i:s’) . “‘”」と書きます。date 関数を囲む「’」が実際わずらわしいのですけれども、これがないとシンタックスエラーとなりますので、仕方がないと思います。
  • updateAll はサニタイズしないので、しっかりサニタイズする必要があります。

おわりに

参考にさせていただいたページたちです。ありがとうございます♪

ちなみに、ほかの方法として、save や saveAll を使う方法があります。引数に存在する id を指定してやれば OK です。

コメントを残す

コメントを残す