7

現在の「ダーティ」バージョン (一部のプロパティが変更され、まだ永続化されていないオブジェクト) と「元の」バージョン (データがまだデータベース内にあるオブジェクト) の間でエンティティ オブジェクトの状態を比較することは可能ですか?

私の仮定は、「ダーティな」オブジェクトを作成し、DB から新しいオブジェクトを取得して 2 つを比較できるというものでした。例えば:

$entity = $em->getRepository('MyContentBundle:DynamicContent')->find($id);

$editForm = $this->createContentForm($entity);
$editForm->bind($request);

if ($editForm->isValid()) {
    $db_entity = $em->getRepository('MyContentBundle:DynamicContent')->find($id);

    // compare $entity to $db_entity

    $em->persist($entity);
    $em->flush();

    return $this->redirect($this->generateUrl('content_edit', array('id' => $id)));
}

しかし、私の経験では、$entity と $db_entity は常に同じオブジェクトです (そして、フォーム $request bind の後に $entity と同じデータを持ちます)。比較のために、「ダーティ」バージョンと一緒に $entity の新しいバージョンを取得する方法はありますか? 私が見たソリューションはすべて、フォームのバインドが発生する前に必要なデータを取得しますが、その制限はありません。

更新:明確にするために、エンティティのプロパティの変更だけでなく、関連するエンティティのコレクションも探しています。

4

2 に答える 2

11

Doctine の UnityOfWork を介して、エンティティで何が変更されたかを取得できます。それは非常に簡単です: エンティティを永続化した後、Doctrine はデータベースで何を更新するかを認識します。これらの情報は、次のようにして取得できます。

// Run these AFTER persist and BEFORE flush
$uow = $em->getUnitOfWork();
$uow->computeChangeSets();
$changeset = $uow->getEntityChangeSet($entity);
于 2013-03-13T14:56:32.707 に答える
7

フラッシュした後$em、データベースで発生します(コミットされます)..だから...$db_entity前に取得することをお勧めしますflush()


  1. 私はあなたが何を望んでいるのかわかりません..しかし、merge代わりに使用することもできますpersist

    • merge変更されたオブジェクトを返しています - ID が生成され、設定されました
    • persistインスタンスを変更しています
  2. オブジェクトを変更し、persisted以前は使用したくない場合flush

  3. EntityManagerあなたがしなかったので、あなたに同じインスタンスを与えています$em->clear()
    • flushすべての変更をコミットしています (すべてのdirtyオブジェクト)
    • clearメモリキャッシュをクリアしています。そのため、find(..., $id)新しいインスタンスを取得できます
  4. キーワードはcloneあなたのために働いていますか?この例のように:

$entity = $em->find('My\Entity', $id);
$clonedEntity = clone $entity;

また、こちらもお読みください: Wakeup または Clone の実装

于 2013-03-13T14:57:41.980 に答える