[cakephp2]論理削除するビヘイビア

投稿者: | 2017年6月15日

cakephp2でテーブルを論理削除する場合、開発者任せにしておくと、人によってdelete_flagであったり、delet_flgであったり、is_deletedであったり、カラム名が統一されなかったり、findの度に削除フラグを検索対象に含まなければならなかったりします。

特にfindの場合、検索対象に論理削除フラグを入れ忘れていて新たなバグを生み出す可能性もあります。

人によってバラバラや、人が気をつけなければならないといった状態はよくないので、cakephpで用意されているSoftDeleteBehaviorを使います。

以下よりSoftDeleteBehavior.phpをダウンロードして、Model/Behavior配下に置きます。
Model/Behavior/SoftDeleteBehavior.php

あとは、使いたいモデルで以下よのうに呼び出します。

class Cart extends AppModel
{
    // 論理削除用ビヘイビア
    $actAs = ['SoftDeleteBehavior'];

論理削除にしたいテーブルで以下のようなカラムを追加します。
・削除フラグ
deleted  tinyint(1) デフォルト:0

・削除日時
deleted_date datetime

AppModelには以下記述しておきます。

class AppModel extends Model
{
    public function exists($id = null) {
        if ($this->Behaviors->attached('SoftDelete')) {
            return $this->existsAndNotDeleted($id);
        } else {
            return parent::exists($id);
        }
    }

    public function delete($id = null, $cascade = true) {
       $result = parent::delete($id, $cascade);
        if ($result === false && $this->Behaviors->enabled('SoftDelete')) {
            return (bool)$this->field('deleted', array('deleted' => 1));
        }
        return $result;
    }
}