我无法重现您使用以下CLI脚本描述的问题。这些示例在tools/sandbox/index.php
示例(包含在ODM存储库中)之后建模,并且正在从同一目录运行。
第一个脚本,poll.php
,刷新一个特定的文档,一旦第二和打印一些串场:
<?php
require_once __DIR__ . '/config.php';
$id = new MongoId('5432e4e6e84df199228b4567');
$repo = $dm->getRepository('Documents\User');
$user = $repo->findOneBy(['_id' => $id]);
$iteration = 0;
printf("%d: %s\n", $iteration, $user->getUsername());
poll: {
sleep(1);
$iteration++;
$dm->refresh($user);
printf("%d: %s\n", $iteration, $user->getUsername());
}
goto poll;
第二个脚本,modify.php
,改变了同一文档的领域一个随机字符串。
<?php
require_once __DIR__ . '/config.php';
use Documents\User;
$id = new MongoId('5432e4e6e84df199228b4567');
$user = new User();
$user->setId($id);
$user->setUsername(md5(rand()));
$dm->persist($user);
$dm->flush();
printf("Changed username to: %s\n", $user->getUsername());
我制成一个小的变化到tools/sandbox/Documents/User.php
模型和添加setId()
方法。这允许modify.php
脚本在第一次运行时执行upsert并创建稍后将修改的文档。
有了这两个文件,我就开始做事了创建文档:
$ php modify.php
Changed username to: 9bdfab05b06306e97d2f63c9bc0a34ef
我随后在第二终端开始poll.php
,并着手运行modify.php
几次:
$ php poll.php
0: 9bdfab05b06306e97d2f63c9bc0a34ef
1: 9bdfab05b06306e97d2f63c9bc0a34ef
2: 8420c8ef0ee7194624fead56585e8be5
3: 8420c8ef0ee7194624fead56585e8be5
4: bf2ec4bafae4cf47e3162ce857e861e7
5: bf2ec4bafae4cf47e3162ce857e861e7
6: bf2ec4bafae4cf47e3162ce857e861e7
7: 2051dd54bc2883f6c11e6c2bbfdfd13e
8: 2051dd54bc2883f6c11e6c2bbfdfd13e
9: 2051dd54bc2883f6c11e6c2bbfdfd13e
如果您追踪DocumentManager::refresh()
内的呼叫,您会发现它最终会调用DocumentPersister::refresh()
,它非常简单地通过Doctrine\MongoDB\Collection
包装类查询原始文档数据,数据,并重置原始文档数据(用于变更集计算)。调试原始数据(来自MongoDB),如果你没有看到新的数据,那么获取水分并重新分配给快照的原始数据将是一个很好的开始。
我认为你需要解开第二个控制器中的对象,因为有多个EntityManagers – manix 2014-10-06 01:19:36