#はじめに
今更ながら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()を記述している人は以下のコードはいらないです。
CakePlugin::load('Utils');
次に、対象のモデルでSoftDeleteBehaviorを利用できるようにします。
class User extends AppModel{
public $actsAs = ['Utils.SoftDelete'];
}
最後にModel/AppModel.phpに以下のコードを追記します。
このコードの意味合いは、
CakeDC/utilsのreadme.mdに説明が書いてありますのでそちらを読んでください。
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
ですが、以下のコードで独自のカラム名に変更ができます。
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