2011-10-31 4 views
21

エンティティの既存のバージョンを取得して、最新のバージョンと比較できるようにしたいと考えています。例えば。ファイルを編集して、DBに入ってから値が変更されたかどうかを知りたい。Symfony 2でDoctrine 2の結果をキャッシュする方法を止めるには?

$entityManager = $this->get('doctrine')->getEntityManager(); 
    $postManager = $this->get('synth_knowledge_share.manager'); 

    $repository = $entityManager->getRepository('KnowledgeShareBundle:Post'); 
    $post = $repository->findOneById(1); 

    var_dump($post->getTitle()); // This would output "My Title" 
    $post->setTitle("Unpersisted new title"); 

    $existingPost = $repository->findOneById(1); // Retrieve the old entity 

    var_dump($existingPost->getTitle()); // This would output "Unpersisted new title" instead of the expected "My Title" 

どのように私はこのキャッシュを回避することができます知っていますか?

答えて

40

これは正常な動作です。

Doctrineは、取得したエンティティの参照をEntityManagerに保存するので、別のクエリを実行せずにそのIDでエンティティを返すことができます。

あなたが何かを行うことができます - あなたは再びそれを保持したい場合>マージ()メソッド

$entityManager = $this->get('doctrine')->getEntityManager(); 
$repository = $entityManager->getRepository('KnowledgeShareBundle:Post'); 
$post = $repository->find(1); 

$entityManager->detach($post); 

// as the previously loaded post was detached, it loads a new one 
$existingPost = $repository->find(1); 

をしかし、$ポストエンティティが切り離されたように、そのの点に注意して、あなたが使用する必要があります。

+4

おいしい、「デタッチ」は完璧です。 –

+10

ありがとうございます。クイックヒント - すべてのエンティティを分離する必要がある場合(非絶縁テストなど)、 '$ entityManager-> clear()'を使うことができます。 – richsage

+0

もう1つは、取引を開いているかどうかです。 '$ entityManager-> beginTransaction()'を実行したなら、エンティティマネージャをクリアしようとする前にトランザクションを閉じてください(例えば '$ entityManager-> rollback()')。開いているトランザクションは、データベースの一貫性のある、したがって更新されていないビューを強制します。 – stanhope

8

refreshメソッドを使用することもできます。これは、データベースからのエンティティの永続状態をリフレッシュし、まだ保持されていないローカル変更をオーバーライドします。以下のような 何か:

$entityManager = $this->get('doctrine')->getEntityManager(); 
$repository = $entityManager->getRepository('KnowledgeShareBundle:Post'); 
$post = $repository->find(1); 

$entityManager->refresh($post); 

は今$ポストは、データベースからの最後のバージョンが含まれています。

+1

あなたは命の恩人です! –

+0

これは本当に便利で、ほとんど知られていないようです。これがうまく機能するには、カスケード=関連するエンティティの「リフレッシュ」を考慮する価値がある – DevDonkey