概要
SoftDeleteBehaviorを使って論理削除にしてみる。
PHP5.4、CakePHP2.2.5を利用。
SoftDeleteBehaviorの導入
まず、CakeDCのutilsに置いてあるソースを取ってくる。(MITライセンス)
https://github.com/CakeDC/utils/blob/master/Model/Behavior/SoftDeleteBehavior.php
取ってきたら、app/Model/Behaviorの下に置く。
うちの環境だと何かとエラーが出たので以下の行をさらっと修正。
1 2 3 4 5 6 7 8 9 10 11 |
public function setup($model, $settings = array()) { ↓ public function setup(Model $model, $settings = array()) { public function beforeFind($model, $query) { ↓ public function beforeDelete(Model $model, $cascade = true) { public function beforeDelete($model) { ↓ public function beforeDelete(Model $model, $cascade = true) { |
これで動いた。
テーブルの用意
SoftDeleteBehavior.phpのソースを見ると、削除フラグとかを立てるデフォルトのカラム名として、deletedとdeleted_dateが指定されている。ということで試しに下記のようなユーザ情報を登録するテーブルを作ってみる。MySQL利用。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
CREATE TABLE `users` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `username` varchar(20) NOT NULL, `dispname` varchar(20) NOT NULL, `password` varchar(50) NOT NULL, `role` varchar(10) NOT NULL, `created` datetime NOT NULL, `modified` datetime NOT NULL, `deleted` tinyint(1) NOT NULL DEFAULT '0', `deleted_date` timestamp, PRIMARY KEY (`id`), UNIQUE (`username`) ) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8; |
削除フラグ(deleted)はtinyint(1)で登録すると良いらしい。デフォルト値で0が入るようにしておく。新規登録時とかに勝手に0を入れてくれたりはしないようで、DEFAULT NULLにしておくとdeletedの値がNULLになって検索にヒットしなくなってしまった。
Modelの用意
最後にModelにSoftDeleteBehaviorを使うことを明記する。
1 |
public $actsAs = array( 'SoftDelete' ); |
これで普通にModelでdeleteを走らせると、物理削除されずに論理削除(deleted=1)されるようになった。検索した場合はdeleted=0が条件に入るので、削除されたレコードはヒットしなくなる。
ただ、Modelに対してexistsした時はIDのみで検索にいくようで、結果がtrueになる。これを避けたいのであればexistsをオーバーライドしてしまえば良いだろうか。
1 2 3 4 5 6 7 8 9 10 11 |
public function exists($id = null) { if ($id === null) { $id = $this->getID(); } if ($id === false) { return false; } $conditions = array($this->alias . '.' . $this->primaryKey => $id, $this->alias . '.deleted' => '' ); $query = array('conditions' => $conditions, 'recursive' => -1, 'callbacks' => false); return ($this->find('count', $query) > 0); } |
The following two tabs change content below.

masato watanabe
もふもふ部ブレーン。プログラマ兼ライター。

最新記事 by masato watanabe (全て見る)
- CakePHPでExcel出力してみる - 2013年2月5日
- CakePHPでテーブルの情報をCSVに吐いたり読んだりしてみる - 2013年2月1日
- CakePHPのModelの動きを論理削除にしてみる - 2013年2月1日