何かというとcakeでは通常$model->delete();すると物理削除でレコードごとなくなりますが、
これがあら不思議!このビヘイビアを使うと論理削除にしてくれます。
というものです。いや幸せ。
さて準備です。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が聞いて削除状態になりました。
ここらへんはもうちょっと調べて挙動を確認してみないといけないですね。新しいことがわかったらまた追記したいと思います。