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

时间:2011-06-08 14:23:33

标签: php mongodb doctrine-odm

我在文档User中引用了一个文档Person。当我检索User时,它没有嵌入Person对象,而是Person代理对象。有没有办法“强制”代理成为“完整”文档(所以Person proxy => Person)。

我尝试调用一种方法来检索其他数据(因此__load被触发,但该对象仍然是'代理'版本。

我希望有人能够比ODM的文件更能说明这一点。

2 个答案:

答案 0 :(得分:2)

您可以通过Priming References完成此操作。

示例文档:

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

答案 1 :(得分:2)

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

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

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

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

请参阅: Doctrine ODM Doc: Disabling hydration了解更多信息。