文書が埋め込まれている文書があります。初めてオブジェクトを作成すると、すべて正常に動作しますが、ドキュメントを更新しようとすると、埋め込みドキュメントは更新されません。Doctrine MongoDBの埋め込みドキュメントを更新するにはどうすればよいですか?
/** @MongoDB\Document */
class DocumentA
{
/** @MongoDB\EmbedOne(targetDocument="DocumentB") **/
protected $docB;
/** @MongoDB\String */
protected $valueA;
}
/** @MongoDB\EmbeddedDocument */
class DocumentB
{
/** @MongoDB\String */
protected $valueB;
}
私のアプリケーションでは、ドキュメントに対してクエリを行い、値を更新してデータストアに保持します。
// Variant A – Does not work
$document = ... // find from data store
$document->setValueA('Hello World');
$document->getDocB()->setValueB('foo baz');
$om->persist($document);
$om->flush();
私が埋め込まれた文書を更新しますが、新しいものすべてを設定しない場合
が正常に動作します:// Variant B - Does work
$document = ... // find from data store
$document->setValueB('Hello World 2');
$document->setDocB(new DocumentB());
$document->getDocB()->setValueB('foo baz 2');
$om->persist($document);
$om->flush();
私が言ったように、バリアントBが正常に動作します。しかし、私のアプリケーションでは、ドキュメントはより複雑で、埋め込まれたドキュメントを更新するたびに新しいオブジェクトを作成することは実用的ではありません。 Doctrine ODMに埋め込みドキュメントの値を見て更新する必要があるかどうかを判断する方法がありますか?
埋め込みドキュメントを別のドキュメントに置き換える際に問題が発生しました。私の場合、DocumentBは組み込みドキュメントではなく、ドキュメントです。あなたがここに示したようなオブジェクトでデタッチを使用することは、このシナリオでも同様に働きました。 – Onema