如何强制学说从数据库重新加载数据?

时间:2013-02-07 22:00:26

标签: symfony-2.1 doctrine-odm

我在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) 

我得到同样的东西。无论如何我还要回到数据库获取价值吗?

6 个答案:

答案 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');