2011-07-27 34 views
2

在Doctrine 1.x中,有一個$ entity-> isModified()方法,它碰巧非常有用。有沒有人找到在Doctrine 2.x中複製這個功能的方法?學說2.x - isModified相當於?

我已經探索了一些途徑,比如檢索UnitOfWork,要求它計算有問題的實體的變化,然後詢問該實體是否在隊列中進行更改,但所有這些都導致了討厭諸如M2M關係的副作用插入兩次,導致數據庫約束異常。我想這意味着這是「不是預期的用法」!

這似乎是一個巨大的重複工作,通過另一種方法來追蹤變化時,當教條已經保持跟蹤,所以我希望有一種方法。

回答

1

我想看一些代碼來了解它是如何插入兩次。另外,你爲什麼要這樣做?

無論如何,你可以考慮改變你的tracking policy。聽起來像你在尋找通知政策。

否則,如果您可以避開它,您總是可以使用pre-update註釋。

我建議你不要在關聯中使用persist/all cascade - 你會得到一個異常,然後你需要首先堅持關聯。也可以幫助調試雙持續問題。

+0

謝謝 - 已更新後添加一些細節:) 我們開始認爲沿線的東西通知跟蹤政策中建議的內容似乎還有待改進。 – Mark

0

在我們基於Doctrine 1.x的CMS中,我們通常會獲取有問題的實體,填充數據,然後詢問$ entity-> isModified()? (如果沒有的話,我們可以發送反饋給用戶 - 「沒有變化」)

代碼明智的,將IsModified()的替代是像這樣:

public function isModified($entity) { 
    $metadata = $this->em->getClassMetadata(get_class($entity)); 
    $uow = $this->em->getUnitOfWork(); 

    $uow->computeChangeSet($metadata, $entity); 
    return $uow->isEntityScheduled($entity); 
} 

不幸的是,如果我們增加了M2M關係,這會導致M2M在持續時被添加兩次,可能是因爲Doctrine正在調用uow-> computeChangeSets(),導致M2M插入排隊兩次。

我們採取了類似於通知跟蹤政策中建議的措施 - 基本上吸引了我們所有的設置者。

注意此答案由OP馬克張貼在問題