46

我在 symfony2.1 安装中使用了学说/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) 

我得到同样的东西。无论如何,我是否可以返回数据库获取价值?

4

6 回答 6

61

您是否刷新了对$audit对象的更改?

$audit = $dm->getRepository("WGenSimschoolsBundle:Audit")->findOneById("xxxx");
//do something somewhere to change the object
$dm->flush();

每次您执行findBy(...)findOneBy(...)实际从数据库中获取一个新文档时。(你应该在 Symfony 分析器中看到查询)

使用 find() 代替,它将从他的内部代理缓存中获取文档。在您调用该$dm->clear()方法之前,文档将保留在代理缓存中。

于 2013-04-29T09:34:15.393 回答
42

这对我有用:

$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);
于 2013-03-28T17:24:13.750 回答
27

添加到以前的答案中,我正在搜索如何刷新数据库Entity,而不是 a,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();

现在,密码哈希在查询之间发生了变化!耶 !

于 2014-04-17T10:04:11.963 回答
8

您可以使用方法 refresh :

$post; # modified
$entityManager->refresh();
$post; # reset from db
于 2017-03-19T21:58:42.947 回答
3

在处理相关实体时,如果修改相关实体并通过父对象保存,则必须添加选项 cascade={"detach"} 才能使分离生效。

例如,假设您要更新 Person 对象上的 Friends 列表,方法是向列表中添加新对象、删除其中一些对象并更新一些现有对象。你会有

$em->flush();
$em->detach($entity);

并在您的 Person 实体中确保更新您的朋友关系:

@ORM\OneToMany(targetEntity="Somewhere\PeopleBundle\Entity\Person", mappedBy="person", cascade={"detach"})
private $friends;
于 2014-03-31T09:53:58.233 回答
1

尝试类似的东西

$dm->getUnitOfWork()->clear('WGenSimschoolsBundle:Audit');
于 2013-02-10T13:37:23.893 回答