如何强制Doctrine MongoDB ODM文档代理转换为';原创';文件


How to force a Doctrine MongoDB ODM Document Proxy to convert to the 'original' document?

我在文档User中引用了一个文档Person。当我检索User时,它没有嵌入Person对象,而是嵌入了Person代理对象。是否有一种方法可以"强制"代理成为"完整"文档(因此Person proxy=>Person)。

我试着调用一个方法来检索额外的数据(所以__load会被触发,但对象仍然是"代理"版本。

我希望有人能比ODM的文件更清楚地了解这一点。

您可以通过初始化引用来实现这一点。

示例文档:

/** @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();

您不需要提取原始对象,因为Proxy类对您的代码应该是100%透明的。

如果需要序列化文档,例如通过API发送文档,请确保在文档上正确实现serialize()方法。

如果您仍然需要在没有代理的情况下获取引用的文档,您可以prime()它,也可以通过指定hydrate(false):的单独查询来获取它

$user = $dm->createQueryBuilder('Person')
            ->field('_id')->equals($user->getPerson()->getId())
            ->hydrate(false)

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