CakePHPで論理削除
6 月 20th, 2008app_model.phpでModelクラスをオーバーライドする。
これで、del()を呼び出すだけで、論理削除されるようになる。子テーブルなどのデータも全て論理削除される。
ただし、ある部分は論理削除、ある部分は物理削除、のような場合、別の対応を取る必要がある。
コードは以下の通り
function del($id = null, $cascade = true) {
if (!empty($id)) {
$this->id = $id;
}
$id = $this->id;
if ($this->exists() && $this->beforeDelete($cascade)) {
$db =& ConnectionManager::getDataSource($this->useDbConfig);
if (!empty($this->behaviors)) {
$behaviors = array_keys($this->behaviors);
$ct = count($behaviors);
for ($i = 0; $i < $ct; $i++) {
if ($this->behaviors[$behaviors[$i]]->beforeDelete($this, $cascade) === false) {
return false;
}
}
}
$this->_deleteDependent($id, $cascade);
$this->_deleteLinks($id);
$this->id = $id;
if (!empty($this->belongsTo)) {
$keys = $this->find('first', array('fields', $this->__collectForeignKeys()));
}
$this->saveField('deleted', date('Y-m-d H:i:s'));
$this->saveField('deletedby', $this->delUser);
return true;
//if ($db->delete($this)) {
// if (!empty($this->belongsTo)) {
// $this->updateCounterCache($keys[$this->alias]);
// }
// if (!empty($this->behaviors)) {
// for ($i = 0; $i < $ct; $i++) {
// $this->behaviors[$behaviors[$i]]->afterDelete($this);
// }
// }
// $this->afterDelete();
// $this->_clearCache();
// $this->id = false;
// $this->__exists = null;
// return true;
//}
}
return false;
}
あとはcontroller内で
$this->ParentModel->delUser = $delUser;
$this->ParentModel->ChildModel->delUser = $delUser;
if ($this->ParentModel->del($id)) {
のようにdelUserをセットして、普通にdel()を呼び出せばいい。
なお、対象テーブルにはdeletedとdeletedbyカラムを用意する必要がある。
ここはdel_flgやdelete_flgなどを用意して、それに対応したソースに修正しても良いと思う。
CakePHPのバージョンは、1.2.0.6311 betaです。