2011-10-31 68 views
21

我希望能夠檢索實體的現有版本,以便我可以將其與最新版本進行比較。例如。編輯一個文件,我想知道數據庫中的值是否已經改變。如何停止Doctrine 2在Symfony 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返回實體而無需執行其他查詢。

你可以這樣做: - 如果你想再次堅持它> merge()方法

$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

美味,'detach'是完美的。 –

+10

謝謝你。快速提示 - 如果您需要分離所有實體(例如,在非絕緣測試中),則可以使用'$ entityManager-> clear()'。 – richsage

+0

另外要注意的是你是否有交易。如果你已經完成了一個'$ 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

這是非常有用的,似乎是鮮爲人知的。值得注意的是在相關實體上有cascade =「REFRESH」,這樣才能很好地工作 – DevDonkey

相關問題