LoginSignup
2
3

More than 3 years have passed since last update.

CakePHP2で論理削除を実装する方法

Last updated at Posted at 2020-09-03

論理削除とは

論理削除とは、ユーザーがブラウザで見た場合は、削除しているように見えるが、実際のデータは別に用意したカラムに保存されている。そのため、削除したデーターを管理者側から復活させることなどが可能。

物理削除とは

データーベースのデーターも削除すること。データーの復旧は不可。
通常のdeleteメソッドを用いた削除方法などはコレ。

さっそく解説

SoftDeleteBehaviorをダウンロードして設置する。

ダウンロードしたファイルをapp/Model/Behaviorのフォルダ内に置く。

テーブルに論理削除用のカラムを作成

削除フラグ
名前:deleted
型:tinyint(1)
※デフォルト値:0

削除日
名前:deleted_date
型:datetime

DBでdeletedカラムをデフォルトで0に設定して、
delete関数が走った時に、deletedカラムに1が立つように実装すれば良い。

論理削除したいモデルで以下のように呼び出します


class 使いたいモデル名 extends AppModel{
    // 論理削除用ビヘイビア
    public $actsAs = array( 'SoftDelete' );

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


class AppModel extends Model {

    public function exists($id = null) {
        if ($this->Behaviors->loaded('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;
    }
}

上記の、delete()はsoftdeleteで上書きされていて、消去ではなくupdate(更新)という形になっている。
また、deletedというカラム名があればそこに1を立ててくれるようになっている。

コントローラーはこんな感じ


  public function delete($id) {
    $this->autoRender = false;
    if($this->request->is('get')) {
      throw new MethodNotAllowedException();
    }

    if($this->User->delete($id)) {
      $this->Session->setFlash('Delete!');
      $this->redirect(array('action'=>'index'));
    }else{
      debug(__LINE__);
    }
  }

はい、これだけでオーケーです。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3