我有一个文档在文档User中引用的人员。当我检索用户时,它没有嵌入Person对象,而是一个Person代理对象。是否有办法“强制”代理成为“完整”文档(所以Person代理=> Person)。如何强制Doctrine MongoDB ODM文档代理转换为“原始”文档?
我已经打过电话来获取额外数据的方法(因此__load被触发,但对象仍是“代理”的版本。
我希望有人能比ODM的机制的文档不会在这个棚更多的光线。
我有一个文档在文档User中引用的人员。当我检索用户时,它没有嵌入Person对象,而是一个Person代理对象。是否有办法“强制”代理成为“完整”文档(所以Person代理=> Person)。如何强制Doctrine MongoDB ODM文档代理转换为“原始”文档?
我已经打过电话来获取额外数据的方法(因此__load被触发,但对象仍是“代理”的版本。
我希望有人能比ODM的机制的文档不会在这个棚更多的光线。
您可以通过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();
这个查询抛出一个异常,因为在使用prime之后,你不能像getSingleResult()那样使用限制。 – Biruwon 2013-03-19 08:40:47
你不应该需要提取原始对象,因为代理类应该是100%透明的代码。
如果您需要序列化文档,例如通过API发送文档,请务必在文档上正确实施serialize()
方法。
如果您仍然需要得到引用文档没有代理,您可以prime()
或用一个单独的查询指定hydrate(false)
取,
$user = $dm->createQueryBuilder('Person')
->field('_id')->equals($user->getPerson()->getId())
->hydrate(false)
参见: Doctrine ODM Doc: Disabling hydration获取更多信息。
这听起来像你试图在非关系数据库中做关系 – EhevuTov 2011-10-08 01:32:56
好吧,我相信你指出的是Doctrine懒加载引用的信息?这究竟是如何困扰您的应用程序或您试图解决的问题? – Dayson 2011-11-30 18:34:15