そんなにGeekじゃないエンジニアブログ

【FuelPHP】CRUDなデータのuptedated_atの更新日時が勝手に変更されないようにしたい!ORMのobserver(オブザーバー)を無効化する方法

calendar

こんにちは。でんすけ(@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で動作を無効化!

それではまたー。

この記事をシェアする

コメント

コメントはありません。

down コメントを残す




CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください