php - 如何更新 Doctrine MongoDB 中的嵌入文档?

标签 php mongodb doctrine doctrine-odm

我有一个嵌入了文档的文档。当我第一次创建对象时,一切正常,但是当我尝试更新文档时,嵌入的文档没有得到更新。

/** @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 查看嵌入文档的值来决定是否应该更新它?

最佳答案

我遇到了完全相同的问题。事实证明,UnitOfWork 似乎无法计算嵌入其他文档的文档变更集,尽管我无法弄清楚为什么...... 结果,当我比较实际值和原始值时,工作单元显示两者的值相同。与您的变体 A 交谈,当您

$document->getDocB()->setValueB('foo baz');

工作单元对旧值和新值都显示“foo baz”,并且不会将其识别为更改,因此不会更新它。

无论如何,这需要一种解决方法:

$document = ... // find from data store
$document->setValueA('Hello World');
$docB = $document->getDocB();
$docB->setValueB('foo baz');
$om->detach($docB);
$om->persist($document);
$om->flush();

这使得工作单元将 $document 的 docB 识别为新设置的文档,并将按预期刷新它。

关于php - 如何更新 Doctrine MongoDB 中的嵌入文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12285741/

相关文章:

php - 需要在一个 JSON 中合并多行

php - 教义异常 : Deadlock found when trying to get lock

mongodb - 由于 x509 证书依赖于旧的 Common Name 字段,因此无法使用 Golang 连接到服务器

linux - 无法在 Ubuntu 17.04 上正确安装 mongodb

mysql - Doctrine Query Builder 转义百分号

php - Doctrine HYDRATE_ARRAY 有什么方法可以保留数据类型?

mysql - Symfony 中带有 ORDER BY 匹配条件的自定义 SQL 查询

php - laravel sanctum SPA 身份验证 protected 路由返回 { "message": "unauthenticated"}

php - gRPC 库已安装但不起作用

node.js - 想要在cloud9本地服务器上安装mongodb