如何强制Doctrine MongoDB ODM文档代理转换为“原始”文档?

8

我有一个文档Person,被文档User引用。当我获取User时,它没有嵌入一个完整的Person对象,而是一个Person代理对象。有没有一种方法可以“强制”代理变成一个“完整”的文档(所以Person代理 => Person)。

我已经尝试调用一个方法来检索额外的数据(所以__load被触发),但对象仍然是“代理”版本。

我希望有人比ODM的文档更能够解释这个问题。


这听起来像是你在非关系型数据库中尝试建立关系。 - EhevuTov
1
好的,我相信你指出的是Doctrine延迟加载引用信息?这个问题具体如何影响你的应用程序或你试图解决的问题? - epicwhale
2个回答

3
你可以通过引用预热来实现这一点。 示例文档:
/** @Document */
class User
{
    /** @ReferenceOne(targetDocument="Person") */
    private $person;
}

/** @Document */
class Person
{
    // ...
}

使用QueryBuilder:
/* @var $user User */
$user = $dm->createQueryBuilder('User')
    ->field('person')->prime(true)
    ->getQuery()
    ->getSingleResult();

这个查询会抛出异常,因为在使用 prime 后,不能像 getSingleResult() 一样使用 limit。 - Biruwon

2
你的代码不需要提取原始对象,因为Proxy类应该对你的代码100%透明。
如果你需要序列化文档,例如通过API发送它,请确保在你的Document上正确实现serialize()方法。
如果你仍然需要获取没有代理的引用文档,你可以使用prime()或者使用单独的查询指定hydrate(false)去获取它。
$user = $dm->createQueryBuilder('Person')
            ->field('_id')->equals($user->getPerson()->getId())
            ->hydrate(false)

请参阅Doctrine ODM文档:禁用hydration以获取更多信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接