RSS

cakePHP2.1でSoftDeleteBehaviorを使う

24 3月

何かというとcakeでは通常$model->delete();すると物理削除でレコードごとなくなりますが、
これがあら不思議!このビヘイビアを使うと論理削除にしてくれます。

  • 通常のdelete()呼び出しで物理削除ではなく、deletedに1 が入り、delete_dateフィールドに日時が入る
  • 該当するモデルは何もしなければdelete = 0 である条件を必ずつけてくれる
  • というものです。いや幸せ。
    さて準備です。GitHubのcakeDCから
    ここにあるSoftDeleteBehavior.phpだけをapp/Model/Behaviorにぶっこんでみます。
    例としてモデルは、User.phpにしてみましょう。
    私のモデルは、既にACLのビヘイビアが設定されていますが、それに追加してあげればいいですね。

    	public $actsAs = array(
    					'Acl' => array(
    						'type' => 'requester',
    					),
    					'SoftDelete'
    					);
    

    さて、ここでもうひとつ準備。
    テーブルにフィールドがあれば良いですが、usersテーブルに該当するフィールドを用意しましょう。
    mysqlを例にして下記のようなフィールドを追加します。
    ここで注意・・deletedは指定しないで追加するとtinyint(4)として登録されますのでちゃんとtinyint(1)で指定しましょう。
    これが間違ってると検索時に deleted = ”という謎の条件になってしまいます。

    deleted   tinyint(1)
    deleted_date datetime

    さてこれで用意が整ったので、一覧画面を覗いてみましょう。
    WHERE `User`.`id` = 1 AND `User`.`deleted` = ‘0’ LIMIT 1
    こんな条件が一覧についていたら、やりたいことができたも同然です。
    それでは試しに、ユーザを削除してみると、どうやらエラーがでるみたいですが・・・。

    SoftDeleteBehavior は通常のdelete()を呼ぶとどうやらfalseを返すようです。
    なのでひとまず・・こんなかんじでしのいでみました。

    if (!$this->User->delete()) {
    	$this->redirect(array('action'=>'index'));
    }
    

    さてこれで削除したデータを見てみると、
    いえい!削除されていますよぅ!


    mysql> select deleted,deleted_date from users where id =6;
    +---------+---------------------+
    | deleted | deleted_date |
    +---------+---------------------+
    | 1 | 2012-03-24 19:43:51 |
    +---------+---------------------+
    1 row in set (0.00 sec)

    補足*管理画面などで削除されているユーザ自体も表示したい場合は、現在追加されているSoftDeleteを
    detachしてあげればよいです。例えばこんな感じ。

    public function index(){
    	$this->User->Behaviors->detach('SoftDelete');
    	$this->User->recursive = 0;
    	$this->set('users', $this->paginate());
    }
    

    補足その2*UserモデルにhasManyしているPostモデルにもこのSoftDeleteを摘要して、hasManyの条件として
    depend => trueを設定してみたのですが、どうも連動してSoftDeleteはしてくれませんでした。
    UserモデルのSoftDeleteを外して、物理削除状態にすると、PostモデルのSoftDeleteが聞いて削除状態になりました。
    ここらへんはもうちょっと調べて挙動を確認してみないといけないですね。新しいことがわかったらまた追記したいと思います。

    広告
     
    コメントする

    投稿者: : 3月 24, 2012 投稿先 cakephp

     

    コメントを残す

    以下に詳細を記入するか、アイコンをクリックしてログインしてください。

    WordPress.com ロゴ

    WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

    Twitter 画像

    Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

    Facebook の写真

    Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

    Google+ フォト

    Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

    %s と連携中

     
    %d人のブロガーが「いいね」をつけました。