8

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

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

我希望有人能比 ODM 的文档更清楚地说明这一点。

4

2 回答 2

3

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

示例文件:

/** @Document */
class User
{
    /** @ReferenceOne(targetDocument="Person") */
    private $person;
}

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

使用查询构建器:

/* @var $user User */
$user = $dm->createQueryBuilder('User')
    ->field('person')->prime(true)
    ->getQuery()
    ->getSingleResult();
于 2012-04-01T02:18:38.833 回答
2

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

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

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

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

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

于 2013-04-29T09:50:39.163 回答