CakePHP(1.3系)で開発を行った時のメモです。小ネタです。
CakePHPのモデルにはupdateAllという関数があり、これを使うと1個もしくは複数のレコードを効率良くupdateできます。(これを知る前はいちいちfindしてsaveしてました。)
以下のような感じで使えます。
$this->updateAll( array( 'project_id' => "'" . $projectId . "'" ), array( 'user_id' => $userId ) );user_idが一致したレコードのproject_idを更新する例です。データが文字列の場合は自分でクォートする必要があるので気をつけましょう。
ところが運用してみて数時間後、updateされたレコードのmodifiedカラムが更新されないことに気付きました。「?」と思ってぐぐってみると、そういう仕様のようです。
#910 updateAll does not update modified field – CakePHP – cakephp
http://cakephp.lighthouseapp.com/projects/42648/tickets/910-updateall-does-not-update-modified-field
updateAllは単純にupdate文を指定通りに発行するだけのようですね。そうと知って早速以下のように対処しました。
$this->updateAll( array( 'project_id' => "'" . $projectId . "'", 'modified' => "'" . date('Y-m-d H:i:s') . "'" ), array( 'user_id' => $userId ) );これでmodifiedカラムに更新日時が入るようになりました。
ちなみにupdateAllは渡されたデータでそのままupdate文を発行するので、事前にサニタイズ等を施した安全なデータを渡すようにしましょう。さもないとSQLインジェクションなどができてしまう可能性があります。