2016-07-14 38 views
1

爲了避免Slowly Changing Dimension problem(簡而言之:即使用戶從系統中刪除,我想保留我的訂單數據),我想過劫持delete事件和而是在記錄上設置invalid標誌。學說:劫持刪除操作,並使記錄無效

  • 我知道,從StofDoctrineExtensionsBundle的softdeletable過濾器,但我不能確定這是否會級聯到子對象。

  • 這是一個常見的/好的做法/主意,這樣做有以下生命週期回調?:

/

/** 
* @ORM\PreRemove 
*/ 

public function makeInvalid() { 
    $this->enddate = new \DateTime(); // set the end of validity property to now 
    cascadeToRelatedObjects(); // i.e. make sure all 'child' objects also change validity 
    somehowContinueTheOperation(); // i.e. do not cause an Error of sorts 
} 
  • 或者我應該,而是改變功能的表單上的刪除按鈕,並分配一個更新功能,它做到了上述?

回答

0

事實上,使用DoctrineExtensionssoftdeleteable是要走的路。如果您在自己的對象(通常來說,OneToMany中)正確設置cascade={"remove"}選項,它甚至可以級聯。

糾正我,如果我錯了,但我不認爲你需要設置onDelete="CASCADE",因爲這是數據庫執行的功能,它不知道軟刪除的要求,所以它不會軟刪除任何孩子。

我得到這個擴展的最簡單的方法是用命令composer require StofDoctrineExtensionsBundle安裝StofDoctrineExtensionsBundle並在config.yml中配置它,你可以按照下面的描述使用它。然後軟刪除Device的實例也將軟刪除其依賴的Parts

爲了恢復他們,你可能不得不寫一個函數或其他東西。

use Gedmo\Mapping\Annotation as Gedmo; 

/** 
* ... 
* @Gedmo\SoftDeleteable(fieldName="deletedAt", timeAware=false) 
*/ 

class Device { 
    /** 
    * @ORM\Column(name="deletedAt", type="datetime", nullable=true) 
    */ 
    private $deletedAt; 

    /** 
    * @ORM\OneToMany(targetEntity="Part", mappedBy="device", cascade={"persist","remove"}) 
    */ 
    private $parts; 
}