2012-01-19 135 views
3

我有一個preUpdate監聽實體的,我做了一些計算,設定值等刪除實體

在這種監聽我想刪除其他一些相關的實體,但是這似乎沒有不被實體經理沖淡。我該如何去實現這個目標?

回答

8

按照Doctrine2 docs

由於Doctrine無法保證在刷新操作的這一點上正確處理 參照完整性,所以更新實體的關聯更改不會在 此事件中被允許。

這意味着您不應該在preUpdate事件處理期間混淆實體。我建議你通過使用實體管理器將你的邏輯轉移到服務層。寫一個更新你的實體的具體方法,並在那裏做所有複雜的東西。一個實體經理的一個很好的例子是FOSUserBundle的UserManager

+0

聽起來很不錯,謝謝。 – DavidW

+0

我一直在尋找這個幾個小時,一旦我把PreUpdate代碼放入我的服務中,一切都變得簡單了。感謝這個答案,這是最好的解決方案。 –

2

如果您在preUpdate事件監聽器改變一個實體,你需要告訴工作單位重新計算該實體的變更:

$em = $eventArgs->getEntityManager(); 
$cm = $em->getClassMetadata(get_class($entity)); 

$em->getUnitOfWork()->recomputeSingleEntityChangeSet($cm, $entity); 
+0

我已經這樣做了。除了我正在創建和刪除一些其他實體的實體更改外,這些創建和刪除操作也不會被刷新。 – DavidW

+0

它不適用於相關的子實體。 – felipsmartins