我在symfony2.1安装中使用doctrine / mongodb 1.0.0-BETA1。
所以我试图强制我的存储库从我的数据库调用数据,而不是使用它已缓存的对象。
$audit = $dm->getRepository("WGenSimschoolsBundle:Audit")->findOneById("xxxx");
.... do something somewhere to change the object ....
此时如果我打电话
$audit = $dm->getRepository("WGenSimschoolsBundle:Audit")->findOneById("xxxx");
审核数据未发生变化。它仍然具有它最初获取的对象。如果我试着
$dm->refresh($audit)
我得到同样的东西。无论如何我还要回到数据库获取价值吗?
答案 0 :(得分:50)
您是否已将更改刷新到$audit
对象?
$audit = $dm->getRepository("WGenSimschoolsBundle:Audit")->findOneById("xxxx");
//do something somewhere to change the object
$dm->flush();
每次执行findBy(...)
或findOneBy(...)
时,它实际上都会从数据库中提取新文档。 (您应该在Symfony探查器中看到查询)
使用find()代替它,它将从内部代理缓存中获取文档。
在您调用$dm->clear()
方法之前,文档将保留在代理缓存中。
答案 1 :(得分:24)
这对我有用:
$doc = $this->documentManager->getRepository('MyBundle:MyDoc')->find($id);
/* ... in the meanwhile another external process is doing some changes to the object ...*/
$doc = $this->documentManager->getRepository('MyBundle:MyDoc')->find($id); // Perhaps this is not useful
$this->documentManager->refresh($doc);
答案 2 :(得分:20)
添加到之前的答案,我正在搜索如何刷新Entity
的数据库,而不是Document
,但解决方案已关闭。我在这里发帖,其他人在这个页面上遇到了同样的问题。
在我的一项功能测试中,我使用了两次相同的查询:
$em = $kernel->getContainer()->get('doctrine.orm.entity_manager');
$user = $em->getRepository('AcmeUserBundle:User')->findOneBy(array('email' => 'james.bond@secure.gov.co.uk'));
echo "Old hash: ".$user->getPassword() . "\n";
// result: 8bb6118f8fd6935ad0876a3be34a717d32708ffd
然后测试会经历一个更改密码的过程。然后,我重新询问用户,以比较密码哈希是否已随相同的查询而更改:
$user = $em->getRepository('AcmeUserBundle:User')->findOneBy(array('email' => 'james.bond@secure.gov.co.uk'));
echo "New hash: ".$user->getPassword() . "\n";
// result: 8bb6118f8fd6935ad0876a3be34a717d32708ffd # Same !
问题在于,即使测试的控制器更新了哈希,实体管理器也将实体置于缓存中。
因此,解决方案是在两个查询之间添加以下内容:
$em->clear();
现在,密码哈希在查询之间发生了变化!耶!
答案 3 :(得分:2)
当您处理相关实体时,如果修改相关实体并通过父对象保存它们,则必须添加选项cascade = {“detach”}才能使分离生效。
例如,假设您要更新Person对象上的Friends列表,方法是将新对象添加到列表中,删除其中一些对象并更新一些现有对象。你将会有
$em->flush();
$em->detach($entity);
在您的Person实体中,请确保更新您的朋友关系:
@ORM\OneToMany(targetEntity="Somewhere\PeopleBundle\Entity\Person", mappedBy="person", cascade={"detach"})
private $friends;
答案 4 :(得分:2)
您可以使用方法刷新:
$post; # modified
$entityManager->refresh();
$post; # reset from db
答案 5 :(得分:1)
尝试类似
的内容$dm->getUnitOfWork()->clear('WGenSimschoolsBundle:Audit');