4月 162013
 

FuelPHPのOrm\Model_Softを使おう

こんばんは。ファガイです。
本日は、あんまり使われてる形跡がないOrmのModel_Softに関して解説。
Model_Softは1.4か1.5から入った・・・のかな。1.3では入ってなかったと思います。

Model_Softについて

Model_Softとは論理削除に対応したModelです。論理削除とは、物理削除とは異なり、データを残したまま削除することです。例えば、delete_flagと呼ばれるカラムを用意して、delete_flagが1の場合は読ませないようにします。
また、Model_SoftはOrm\Modelを継承しています。

Model_Soft Example

class Model_Sample extends \Orm\Model_Soft
{
    protected static $_properties = array(
        'id',
        'name',
        'createdAt',
        'updatedAt',
        'deletedAt',
    );
    protected static $_soft_delete = array(
        'deleted_field' => 'deletedAt',
        'mysql_timestamp' => true
    );
}

このような形となります。
$_soft_deleteには以下のプロパティが指定出来ます。

key default 解説
deleted_field deleted_at 削除時刻を入れるためのフィールド名
mysql_timestamp true mysqlタイムスタンプを使用するか

基本使用方法

Model_Softクラスは\Orm\Modelを継承しているため、Orm\Modelと同等に扱うことが可能です。
ただ、findやqueryで取得してくる値はdeleted_fieldがnullのものになります。

find_deleted,deleted – 論理削除のレコードを取得する

論理削除されたレコードを取得するにはfind_deletedまたはdeletedを使用します。find_deletedはdeletedのエイリアスのようなものなのでdeletedを使えばよいでしょう。

restore,undelete – 論理削除のレコードを復元する

論理削除のレコードを復元するには、restore()かundelete()を呼び出すだけです。undelete()はrestore()のエイリアスです。

Example

// 削除済みのデータを取得
$deleted = Model_Sample::deleted(1);

// 復元
$deleted->restore();

Model_Softを一部に使いたくないとき、使いたいとき

例えば、カテゴリ一覧を格納するだけのテーブルの場合、削除時刻など不要なものになります。また、逆にこの時だけModel_Softを利用したい。という時があるかもしれません。
そのような際には、$_disable_filterやメソッドを使用します。

■モデル全体にModel_Softの機能を使いたくない時

//そのクラス内に記述
protected static $_disable_filter = array(__CLASS__ => false);

falseの場合は使いたくない時。通常はデフォルトでtrueになる。

■一部に対して適用したい時

//メソッドをオーバーライドした上で、そのメソッドの中で
parent::disable_filter(); //使いたくないとき
parent::enable_filter(); //使いたいとき

まとめ

・論理削除はデータを管理する上で便利。(データが残るため)
・物理削除よりも速度が早い。
・だから使うといいと思うよ。

また、こちらの記事を書く前に私自身である程度クラスのコメントを和訳しておきました。

https://gist.github.com/fagai/5394102

便利かはわかりませんが、参考になればいいかな・・・。
最後に、find_all()とかdeleted_fieldも含めたfindもあれば良かったかな・・・。まぁModel_Softをそのまま拡張すれば簡単に出来るね!

Pocket

 Posted by at 7:31 PM

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>


*