我無法重現您使用以下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