我在文档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文档:禁用水合作用以获取更多信息。