我希望能够检索实体的现有版本,以便将其与最新版本进行比较。例如。编辑文件,我想知道自从进入数据库后该值是否已更改。
$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"
有谁知道如何绕过这个缓存?
答案 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包含数据库中的最后一个版本。