我有一个文档用户中引用的文档人员。当我检索用户时,它没有嵌入一个人对象,而是一个人代理对象。有没有办法“强制”代理成为“完整”文档(所以 Person proxy => Person)。
我尝试调用一种方法来检索其他数据(因此 __load 被触发,但对象仍然是“代理”版本。
我希望有人能比 ODM 的文档更清楚地说明这一点。
我有一个文档用户中引用的文档人员。当我检索用户时,它没有嵌入一个人对象,而是一个人代理对象。有没有办法“强制”代理成为“完整”文档(所以 Person proxy => Person)。
我尝试调用一种方法来检索其他数据(因此 __load 被触发,但对象仍然是“代理”版本。
我希望有人能比 ODM 的文档更清楚地说明这一点。
您可以通过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();
您不需要提取原始对象,因为 Proxy 类对您的代码应该是 100% 透明的。
如果您需要序列化文档,例如通过 API 发送它,请确保serialize()
在您的 Document 上正确实现该方法。
如果您仍然需要在没有代理的情况下获取引用的文档,您可以使用prime()
它或使用单独的查询来获取它,指定hydrate(false)
:
$user = $dm->createQueryBuilder('Person')
->field('_id')->equals($user->getPerson()->getId())
->hydrate(false)
请参阅: Doctrine ODM 文档:禁用补水以获取更多信息。