CakePHPで論理削除

6 月 20th, 2008 | by admin |

app_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です。

1 件のコメント »

  1. とても役に立ちました。
    ありがとうございます!!

    コメント by とに — 2008 年 6 月 20 日 @ 10:36 AM

このコメント欄の RSS フィード トラックバック URL

コメントをどうぞ