削除フラグ

web系の軽いシステムだと、あんまり意識しないことだけど、
業務から流れてきたひとなら半数以上知ってる(と思う)削除フラグ。
これは、DELETEで削除するのではなく、テーブルのフラグを立てることで論理的に削除したものとする手法。
なんでこういうことするかってーと、
間違って消しちゃったときの対応とかあるんだけど、
(作りが悪いのかもしれんが)
AとBのテーブルがあり、
A→Bの関連があるとき、
AにはBの関連キー(FK)があることになる。
もし、関連性が出来ているときに、Bのデータが削除された場合、
AにあるFKは無効な値となる。
それはそれで正しい場合はいいのだが、
無いとダメな場合、どうすんのよ?って事になる。
そのために使うのが、先ほどの削除フラグだ。
実際は削除をしていないので、削除をしてしまっても、データは残っているので問題は起きなくなる。


さて、そうすると、
Bの検索時には、必ず削除フラグが立っていないものを抽出するという条件がついてしまう。
Bが多用される場合、面倒でしょうがない。 付け忘れもおきやすい。


そこで、cakephpのコアでこれを補うよう修正を施してみた。
仕様は以下のとおり。(カラム名とかはソースを修正すれば任意でOK。)


modelクラス(app/models)にフィールド
var $delFlag = true;
があると削除フラグがあるとみなす。


テーブルの削除フラグは カラム名:delFlag 型:int
とすること。

コントローラ側での$this->Model->find*メソッドを呼び出すと、
自動的にdelFlag = 0が追加され検索される。
※メインテーブルのみ有効。
 関連テーブルは今までどおりの抽出。


削除フラグが立っているものを抽出したい場合は、
findメソッドを使う。これ以外では抽出不可。

$this->Model->find(array("delFlag" => 1));


検索の方法が大量にあるので、
全てではテストしていないのだが、
find
findAll
findAllBy*
findNeighbours
は動作確認済だ。
もちろんだけど、findQueryはどーしようもないので、使わない方向で。


敢然なる仕様であれば、コア側で対応するのもアリじゃないかと思う。



ソースはこちら
前と同じだけど、バージョンは1.1.15.5144。
それ以外は(ry