こんにちは。でんすけ(@notgeek_densuke)です。
FuelPHPでの開発中、
データのupdated_atが勝手に更新されちゃうんだけど!?ってなったので、対策をメモ程度に。
スポンサーリンク
ORMパッケージのobserver(オブザーバー)ってなんだ?
Modelを扱う時に便利なORMパッケージというものがありますが、そのパッケージにobserver(オブザーバー)という仕組みが実装されています。
これ、Modelを通じてデータを操作したら、そのイベントに応じて何かしら処理をしてくれるものです。
DBにレコードが作成されたとき、とか、
レコードが変更されたとき、とか。
observerについての詳細は公式ドキュメントにて。
updated_atが問題になるとき
で、僕が直面した問題
「データのupdated_atが勝手に更新されちゃう」
というもの。
先程のobserverが原因。
デフォルトの動きとして、
レコード中のデータが何か書き換えられた場合はupdated_atを更新する、
というobserverの動作があります。
これ、例えば
データの更新日付順でソートして表示したい
みたいな仕様があったとして。
でも、何かしらのフラグとか内部的に使うデータだけを更新したときは、更新日付に影響させたくない、みたいなときがあるわけです。
そういう時は、どうしたらいいんだ!?
observerを無効化する
そこで、できるのが observerを無効化することです。
例えば、こんな感じのコード。
// レコードをDBから取得 $hoge_data = \Model_Hoge::find('all', array('where'=>[])); // データをなんか書き換える $hoge_data->id = 1; // オブザーバーを無効化 $hoge_data->unregister_observer('Orm\Observer_UpdatedAt'); // データをDBに書き込む $hoge_data->save();
上記のように、unregister_observe を使うと、特定のModelインスタンスに対してだけ、observerが機能しない状態にできるのです。
Observer_UpdatedAtをunregistしてやることで、一時的に更新日時を更新しないようにできます。
やったね!
まとめ
ということで、ORMパッケージのobserverの話でした。
イベント処理のように動作してくれて便利ではあるんですが、デフォルトの動きが邪魔になることもあります。
そんな時は、unregister_observeで動作を無効化!
それではまたー。
コメント
コメントはありません。