あっ、普通の 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 はサニタイズしないので、しっかりサニタイズする必要があります。
おわりに
参考にさせていただいたページたちです。ありがとうございます♪
- Model::updateAll(array $fields, array $conditions) Saving Your Data — CakePHP Cookbook v2.x documentation
本家ドキュメントです。updateAll の使い方はもちろん、指定したカラム以外は全く更新しないという仕様や、サニタイズもしない、ということもちゃあんと書いてあります。 - カラムの値を1増やす(インクリメントする)(MySQL)ohanasiya_blog – Blog
MySQL のドキュメントは見ていないですけれども、このページの方法をやってみてできたのでよしとしました。ありがとうございます。 - Ceatant Official Blog – CakePHPでupdateAllを使うとmodifiedを自動で更新してくれない
こちらでわたくしのやりたいことがほとんど書いてありました。すばらしいですっ!!
ちなみに、ほかの方法として、save や saveAll を使う方法があります。引数に存在する id を指定してやれば OK です。