Re: CakePHP 2.x系の更新時のSQL発行回数を減らしたい
http://damepg.hatenablog.com/entry/2012/09/08/134126
ちょうど最近同じことやってました。
僕の場合は、updateAll()で対応しました。
元エントリの例にならうと、こんなかんじ。
<?php public function addPoint($user_id, $point) { $ret = $this->updateAll( array('point' => $this->escapeField('point') . ' + ' . $this->getDatasource()->value($point)), array('id' => $user_id) ); if ($ret === false) { // エラー処理 } if ($this->getAffectedRows() == 0) { // エラー処理 } }
発行されるSQLはこんなかんじ。
UPDATE `sample`.`users` AS `User` SET `User`.`point` = `User`.`point` + 10 WHERE `id` = 1
updateAll()使う利点としては、
- aliasなど、モデルの設定の恩恵を受けられる
- 検索条件がfindと同じ形式で設定できる
いっぽう欠点としては、
- setするフィールド値のエスケープがめんどくさい
というところかなぁ、と思います。
あと書いてて気付きましたが、どちらの方法もmodifiedが自動更新されないのできちんと指定してやらないといけないんですね。
参考:
"updateAll" フォーラム - CakePHP Users in Japan
Ceatant Official Blog - CakePHPでupdateAllを使うとmodifiedを自動で更新してくれない