简介
虛刪除本質上是隱藏在資料庫中條目的能力,代替移除條目的一切痕跡。这意味著資料可在日後被用來檢索。另一種想法是歸档資料。
例如,你可能有一套記錄員工工作時数的系统。每天員工紀錄他們的時間,如此報告可以被產生來淘汰偷懶的人。如果有人被開除,你不再希望他們可以存取該系统,但保留工作時間上的資料可能仍然是有用的。
如果該員工被虛刪除,那麼就系统涉及的而言,該員工不再存在。虛刪除模型提供一種方式來查詢此歸档資料,如此報告仍然可以使用此「刪除的」資料來產生。
有人主張避免虛(或邏輯的)刪除。此模型并不強制你使用虛刪除,但提供了一種在你專案中快速實现的方式,如果你決定要使用它。
基本使用
使用虛刪除模型就像擴充 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 的關聯條目。