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を自動で更新してくれない