LoginSignup
5
6

More than 3 years have passed since last update.

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

Posted at

はじめに

今更ながらCakePHP2.xでの論理削除を実装したのでメモします。
論理削除の実装にはCakeDC/utilsのSoftDeleteBehaviorを使わせて頂きました。

今回論理削除を実装するにあたり色々調べたのですが、
githubからSoftDeleteBehavior.phpのファイルをダウンロードして、
直接プロジェクトのModel/Behaviorディレクトリに配置する方法は情報があったのですが、
composerでCakeDC/utilsをインストールして
Pluginディレクトリから使用する方法が見当たらなかったので記事にしようと思いました。

もはや需要はないかもしれない…

環境

Windows7にて作業

PHP 7.3
CakePHP 2.10

今回使用するプラグイン

CakeDC/utils

実装方法

1.CakeDC/utilsをcomposerでインストール

プロジェクトディレクトリのルートにて以下のコマンドを実行する。

composer require cakedc/utils

成功するとプロジェクトのPluginディレクトリにUtilsディレクトリが配置されます。
※php7.3を使う場合composerのバージョンが低いとエラーが出るので注意

2.テーブルにカラムを追加

論理削除を実装したいテーブルに削除フラグ・削除日時のカラムを追加する。
私の場合以下の設定にしました。

削除フラグ

名前:deleted
型:tinyint(3) unsigned
※デフォルト値:0

削除日時

名前:deleted_date
型:timestamp

3.モデルにSoftDeleteBehaviorを追加

まずはcakedc/utilsプラグインをbootstrap.phpでロードします。
CakePlugin::loadAll()を記述している人は以下のコードはいらないです。

Config/bootstrap.php
CakePlugin::load('Utils');

次に、対象のモデルでSoftDeleteBehaviorを利用できるようにします。

Model/User.php
class User extends AppModel{
    public $actsAs = ['Utils.SoftDelete'];
}

最後にModel/AppModel.phpに以下のコードを追記します。
このコードの意味合いは、
CakeDC/utilsのreadme.mdに説明が書いてありますのでそちらを読んでください。

Model/AppModel.php
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;
}

これで論理削除の実装完了です。

4.独自のカラム名に変更

SoftDeleteBehaviorで定義されている
デフォルトのカラム名は
削除フラグ:deleted
削除日時:deleted_date
ですが、以下のコードで独自のカラム名に変更ができます。

Model/User.php
class User extends AppModel{
    public $actsAs = ['Utils.SoftDelete'=>['削除フラグ名'=>'削除日時名']];
}

5.削除済みのデータの取得について

findの実行前に以下のコードを実行すれば削除済みのデータも取得できます。
このコードを実行した後にdeleteを実行してしまうと物理削除されるので注意です。
deleteする際は引数をtrueにして再度実行してからであればOKです。(そんな状況があればですが)

$this->User->softDelete(false);

※User(モデル名)は自分が論理削除を実装したモデル名に変更してください。

参考

今回の作業の参考にさせて頂きました。

http://www.tailtension.com/cakephp/398/
cakePHP CakeDCのsoftDelete

5
6
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
5
6