当前位置: 首页 > 文档资料 > FuelPHP 中文文档 >

虛刪除模型 - Orm 套件

优质
小牛编辑
120浏览
2023-12-01

简介

虚删除本质上是隐藏在资料库中条目的能力,代替移除条目的一切痕迹。这意味着资料可在日后被用来检索。另一种想法是归档资料。

例如,你可能有一套记录员工工作时数的系统。每天员工纪录他们的时间,如此报告可以被产生来淘汰偷懒的人。如果有人被开除,你不再希望他们可以存取该系统,但保留工作时间上的资料可能仍然是有用的。

如果该员工被虚删除,那幺就系统涉及的而言,该员工不再存在。虚删除模型提供一种方式来查询此归档资料,如此报告仍然可以使用此「删除的」资料来产生。

有人主张避免虚(或逻辑的)删除。此模型并不强制你使用虚删除,但提供了一种在你专案中快速实现的方式,如果你决定要使用它。

基本使用

使用虚删除模型就像扩充 Orm\Model_Soft 而不是 Orm\Model 一样的简单。这标誌你的模型做为一个虚删除模型,并且改变 delete()find() 方法的预设行为。

class Model_Employee extends \Orm\Model_Soft
{
	...
}

该模型设置像一般的 ORM 模型,包含你想使用的任何关联或其他特性。

设定

目前有两个额外的设定,可以为虚删除模型被设定。

deleted_field 是储存时间戳记的栏位。在资料库中这应该是一个 MySQL 或 unix 时间戳记,并预设为 NULL。任何有 NULL 时间戳记的条目不会被删除。行名称预设为 deleted_at。

mysql_timestamp 是如果该时间戳记被产生,应该是一个 MySQL 时间戳记或一个 unix 时间戳记。此预设为 false(使用一个 unix 时间戳记)。

有预设设定的模型範例:

class Model_Employee extends \Orm\Model_Soft
{
	protected static $_soft_delete = array(
		'deleted_field' => 'deleted',
		'mysql_timestamp' => false,
	);
}

删除

要触发虚删除只要在该物件选择之后呼叫一般的 delete() 函式。这用目前时间戳记更新资料库条目并标誌该条目为删除。该条目将不再出现在 find() 查询中。

$employee = Model_Employee::find(1);
$employee->delete(); // 该员工现在被虚删除了。

永久删除

要永久删除一笔资料,在选择之后于物件呼叫 purge() 函式。这会从资料库永久删除资料。

$employee = Model_Employee::find(1);
$employee->purge(); // 该员工现在被删除了。

寻找

虚删除条目不会被 find() 请求列出,他们从回传结果被排除因为他们,就 Model_Soft 涉及的而言,已经被删除。透过使用 find_deleted()deleted() 来查询删除的条目是有可能的。这些都像 find() 一样运作并且期望一样的参数。

还原

已虚删除的条目可以在日后被还原。假设我们的员工之一回归,我们可以只还原虚删除的条目并让一切再度为她运作,而不必建立新的员工。

这透过在删除的条目上呼叫 restore()undelete() 能轻易地做到。

$employee = Model_Employee::find_deleted(1);
// 或
$employee = Model_Employee::deleted(1);

$employee->restore(); // 该员工不再是被删除的。
$employee->undelete(); // 与上述执行相同。

关联

删除

delete 函式将虚删除提供 cascade_delete 为 true 的关联模型。如果该关联模型不是虚删除,那幺一个 RelationNotSoft 例外会被抛出。

还原

restore 函式也会为了关联来还原提供 cascade_delete 为 true 的关联条目。