如何阻止Doctrine 2在Symfony 2中缓存结果?

时间:2011-10-31 15:44:23

标签: php caching doctrine-orm symfony

我希望能够检索实体的现有版本,以便将其与最新版本进行比较。例如。编辑文件,我想知道自从进入数据库后该值是否已更改。

    $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"

有谁知道如何绕过这个缓存?

2 个答案:

答案 0 :(得分:42)

这是正常行为。

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);

但请注意,由于$ post实体已分离,因此如果要再次保留它,则必须使用 - > merge()方法。

答案 1 :(得分:12)

您还可以使用refresh方法,该方法从数据库刷新实体的持久状态,覆盖尚未保留的任何本地更改。 类似的东西:

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

$entityManager->refresh($post);

现在$ post包含数据库中的最后一个版本。