cakephp1.3 saveメソッドで更新日時がudpateされない

大分ご無沙汰しております。ビールがおいしい季節になりました。

cakePHPは、modified,createdなんてフィールドを予め作成しておくと、新規作成・更新の際に勝手にデータをinsert,updateしてくれるというお便利機能があります。

先日、以前と同じように更新のため、

$this->User->save($this->data);

なんて処理をしていたときに、突然、「更新日時が更新されない」という現象に遭遇しました。

実は、探してみると

  • mysqlの設定が悪い
  • そもそも、hiddenとかでPOSTしてた
  • という人たちの記事があって、はじめはそこを疑いました。ですが以前はきちんと動いていたのに、突然save()時に更新日時modifiedが更新されない現象だったので、他の原因を探ってみました。

    結論からいうと、ここのsaveの直前に

    $this->User->id = user_id;
    $this->User->read();
    

    というreadメソッドを呼び出すことで、コアのmodel.php側のsave()内で$this->dataを参照すると、
    read()時にセットしたであろう、更新日を含めた一行まるごとのデータ構成になっていました。
    その後、処理としては実際にsave()に投げられた引数$dataとmodel内の$this->dataとを、マージしているらしく、結果として、

    パスワードだけ変更する画面だったけど、実際はすべてのデータをupdateしてた(実際はパスワード以外のデータは
    データベースから参照された値なので、変更点はなく、更新日時すらも含まれているので結果、更新されていない)
    という現象でした。
    なぜ、直前でreadなんぞしているかというと、変更点を調べたいために、事前に更新前のデータを取得しておく必要があったのです。

    解決方法
    解決方法はいくつかあると思うのですが今回は・・・このようにしてみました(これが推奨されるわけではないと思います)。

    $this->User->data  = null;//readしたデータをリセットする。
    $this->User->save($this->data);
    

    本来の正しい修正方法としては第3引数に更新対象のフィールドを含めて、余計なフィールドは含ませないことがポイントだと思われます。
    恥ずかしながら・・・controller側で参照している$this->data と、model 側で参照している$this->data は完全に一致しているものと思い込んでいましたが、実際のところ違う、ということですね。2.0からは明確に表示が変わるので、今後は意識して使ったほうがいいのだろうか・・。

    おなかへりました!ビールのみにさまよってきまーす。

    広告