虛刪除模型 - Orm 套件
简介
虚删除本质上是隐藏在资料库中条目的能力,代替移除条目的一切痕迹。这意味着资料可在日后被用来检索。另一种想法是归档资料。
例如,你可能有一套记录员工工作时数的系统。每天员工纪录他们的时间,如此报告可以被产生来淘汰偷懒的人。如果有人被开除,你不再希望他们可以存取该系统,但保留工作时间上的资料可能仍然是有用的。
如果该员工被虚删除,那幺就系统涉及的而言,该员工不再存在。虚删除模型提供一种方式来查询此归档资料,如此报告仍然可以使用此「删除的」资料来产生。
有人主张避免虚(或逻辑的)删除。此模型并不强制你使用虚删除,但提供了一种在你专案中快速实现的方式,如果你决定要使用它。
基本使用
使用虚删除模型就像扩充 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 的关联条目。