2011-06-08 101 views
7

我有一个文档在文档User中引用的人员。当我检索用户时,它没有嵌入Person对象,而是一个Person代理对象。是否有办法“强制”代理成为“完整”文档(所以Person代理=> Person)。如何强制Doctrine MongoDB ODM文档代理转换为“原始”文档?

我已经打过电话来获取额外数据的方法(因此__load被触发,但对象仍是“代理”的版本。

我希望有人能比ODM的机制的文档不会在这个棚更多的光线。

+0

这听起来像你试图在非关系数据库中做关系 – EhevuTov 2011-10-08 01:32:56

+1

好吧,我相信你指出的是Doctrine懒加载引用的信息?这究竟是如何困扰您的应用程序或您试图解决的问题? – Dayson 2011-11-30 18:34:15

回答

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(); 
+0

这个查询抛出一个异常,因为在使用prime之后,你不能像getSingleResult()那样使用限制。 – Biruwon 2013-03-19 08:40:47

2

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

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

如果您仍然需要得到引用文档没有代理,您可以prime()或用一个单独的查询指定hydrate(false)取,

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

参见: Doctrine ODM Doc: Disabling hydration获取更多信息。

相关问题