简体   繁体   中英

How to stop Doctrine 2 from caching a result in Symfony 2?

I want to be able to retrieve the existing version of an entity so I can compare it with the latest version. Eg Editing a file, I want to know if the value has changed since being in the DB.

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

Does anyone know how I can get around this caching?

It's a normal behavior.

Doctrine stores a reference of the retrieved entities in the EntityManager so it can return an entity by it's id without performing another query.

You can do something like :

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

But be aware of that as the $post entity was detached, you must use the ->merge() method if you want to persist it again.

You can also use the refresh method, which refreshes the persistent state of an entity from the database, overriding any local changes that have not yet been persisted. Something like:

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

$entityManager->refresh($post);

now $post contains the last version from database.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM