#論理削除とは
論理削除とは、ユーザーがブラウザで見た場合は、削除しているように見えるが、実際のデータは別に用意したカラムに保存されている。そのため、削除したデーターを管理者側から復活させることなどが可能。
#物理削除とは
データーベースのデーターも削除すること。データーの復旧は不可。
通常の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__);
}
}
はい、これだけでオーケーです。