0

を使用して運がありませんmerge()。私は文書化されていることをほぼ正確に行っています:

/* @var $detachedDocument MyDocumentClass */ 
$detachedDocument = unserialize($serializedDocument);
$document = $dm->merge($detachedDocument);
$document->setLastUpdated(new \MongoDate());
$dm->persist($document);

しかし、変化は決して固執しません。代わりにこれを行う必要があります:

$dm->createQueryBuilder('MyDocumentClass')
    ->findAndUpdate()
    ->field('lastUpdated')->set(new \MongoDate())
    ->getQuery()
    ->execute();

merge()非常に簡単に思えるので、思ったように機能しない理由がわかりません。

4

1 に答える 1

3

最初のコード例では、後にmerge()続くのpersist()は冗長であり、flush()実際にデータベースに書き込む唯一の操作である a を省略しました (2 番目の例のように手動でクエリを実行しない限り)。のコードをUnitOfWork::doMerge()見ていくと、オブジェクトを永続化する (ID がない場合) か、ID でドキュメントを取得することがわかります。最終結果はmerge()、管理されたドキュメントを返すことです。Persist は、呼び出された後にドキュメントが管理されることを保証します (それ自体は何も返しません)。をUnitOfWork::doPersist()調べてみると、マネージ オブジェクトをメソッドに渡すことは事実上 NOOP であることがわかります。

に置き換えpersist()てみてくださいflush()。必要に応じて単一のドキュメントをフラッシュできますが$dm->flush()、デフォルトではすべての管理対象オブジェクトを処理することに注意してください。

それでも問題が解決しない場合は、lastUpdatedフィールドが ODM で適切にマップされていることを確認します。の出力を調べ$dm->getClassMetadata('MyDocumentClass')て確認できます。マップされたフィールドでない場合、UnitOfWork はドキュメント内の変更を検出せず、フラッシュするものは何もありません。

余談ですが、2 番目のコード例では、findAndUpdate()検索条件を指定せずに実行しています ( のみset()が指定されています)。equals()通常、単一のドキュメントがアトミックに変更されて返されるようにするために、変更を次のようなもの (おそらくあなたの場合は ID)とペアにします。

于 2012-05-31T15:10:09.663 に答える