Tengo un documento que tiene un documento incrustado. Cuando creo un objeto por primera vez todo funciona bien, pero cuando intento actualizar un documento, el documento incrustado no se actualiza.¿Cómo actualizo documentos incrustados en Doctrine MongoDB?
/** @MongoDB\Document */
class DocumentA
{
/** @MongoDB\EmbedOne(targetDocument="DocumentB") **/
protected $docB;
/** @MongoDB\String */
protected $valueA;
}
/** @MongoDB\EmbeddedDocument */
class DocumentB
{
/** @MongoDB\String */
protected $valueB;
}
En mi aplicación consulto un documento, actualizo los valores y los conservo en el almacén de datos.
// Variant A – Does not work
$document = ... // find from data store
$document->setValueA('Hello World');
$document->getDocB()->setValueB('foo baz');
$om->persist($document);
$om->flush();
Si no actualizo el documento incrustado, pero especificar una nueva todo funciona bien:
// 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();
Como ya he dicho, la variante B funciona bien. Sin embargo, en mi aplicación los documentos son más complejos y no sería práctico para mí crear un nuevo objeto para el documento incrustado cada vez que tengo que actualizarlo. ¿Hay algún método para decirle a Doctrine ODM que mire los valores de un documento incrustado para decidir si debe actualizarse?
Estaba teniendo problemas para reemplazar un documento incrustado por uno diferente. En mi caso, DocumentB no es un documento incrustado sino más bien un documento. El uso de separar el objeto como el que se muestra aquí también funcionó en este escenario. – Onema