データベースを活用するとき、よく論理削除を使います。 論理削除とは削除時は削除フラグを立てるだけで、実際には削除しないでデータを残しておくというものです。 実際には削除しない事で、トラブルが起きた時にきちんと原因を探る事ができるようになります。 そんな論理削除をfuelphpで使ってみました
データベース側の変更
deletedというカラムをtiny int(1)で作成しました。 基本的にクエリはwhereでdeletedを指定することになるので、きちんとindexを貼っておくといいかもしれません。
モデルの変更
モデルでは、次の3つのメソッドをオーバーライドしました。
/** * * @param type $options * @return OrmQuery */ public static function query($options = array()) { $query = parent::query($options); $query->where('deleted' , 0); return $query; } /** * * @param type $data * @param type $new * @param type $view * @return self */ public static function forge($data = array(), $new = true, $view = null) { $obj = parent::forge($data, $new, $view); if($obj->deleted === NULL){ $obj->deleted = 0; } return $obj; } /** * * @param type $cascade * @param type $use_transaction */ public function delete($cascade = null, $use_transaction = false){ $this->deleted = 1; $this->save($cascade,$use_transaction); }
モデルの新規作成時にきちんとdeleted を初期化するのと、 クエリを作るときは何もきにしなければ自動でdeletedフラグが立っていないものをwhereで指定すること、 削除時にはdeletedを変えるだけで実際には削除しないようにする の3つです。 おそらくホントはテーブル間の関連情報とかそういうのをきちんとしないといけないと思うのですが、 自分はそんな高機能なものを使っていないので結構シンプルに改造出来ました。