2011-07-27 16 views
2

Doctrine 1.xには、$ entity-> isModified()メソッドがありました。このメソッドは非常に便利でした。誰かがDoctrine 2.xでこの機能を再現する方法を見つけましたか?Doctrine 2.x - isModifiedに相当する?

私は、UnitOfWorkを取得し、問題のエンティティの変更を計算し、そのエンティティが変更を待ち行列に入れているかどうかを尋ねるなど、いくつかの方法を検討しましたが、 M2M関係などの副作用が2回挿入され、データベース制約の例外が発生します。私はこれが "意図された使用法"ではないことを意味すると思います!

Doctrineが既にトラックを管理しているときに、別の方法で変更を追跡することに頼っていることは、仕事の膨大な複製のようです。

答えて

1

どのように2回挿入されるのかを理解するためのコードを見たいと思います。また、なぜあなたはこれをしたいのですか?

とにかく、あなたは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追加した場合これにより、おそらくDoctrineがuow-> computeChangeSets()を呼び出してM2Mの挿入を2回キューに入れているために、M2Mが持続するときにM2Mが2回追加されることになります。

私たちは通知トラッキングポリシーで提案されているものに似た何かをすることに頼っています。

NOTEこの答えはOPマークで疑問に