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

2022-08-30 13:54:22

我希望能够检索实体的现有版本,以便将其与最新版本进行比较。例如,编辑一个文件,我想知道值自进入数据库以来是否发生了变化。

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

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


答案 1

这是一种正常行为。

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() 方法。


答案 2

还可以使用该方法,该方法从数据库中刷新实体的持久状态,并重写尚未持久化的任何本地更改。像这样:refresh

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

$entityManager->refresh($post);

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


推荐