2016-11-19 54 views
4

规则物体在我的Symfony2控制器之间的代理对象,我有两个疑问:
就像这个例子:Doctrine2 - 中的getResult

$object = $this->getDoctrine()->getManager() 
      ->createQuery('SELECT PARTIAL o.{id,name,field1} 
          FROM SomeBundle:SomeEntity o 
          WHERE o.id = :objectId') 
        ->setParameter('objectId', $objectId) 
        ->getResult(); 



$objects = $this->getDoctrine()->getManager() 
      ->createQuery('SELECT PARTIAL o.{id,name,field1, field2} 
          FROM SomeBundle:SomeEntity o ') 
        ->getResult(); 

,我收到收集$objects影响是SomeBundle:SomeEntity对象的集合除我收到的变量为$object我收到代理对象。

如果我输出$objects集合,并且对于我想打印包含字段name,field1,field2的输出的每个元素,我会为此对象的field2接收null。事实上,如果我将这个$object与其他控制器一起启动,那么field2在对该对象的每个引用中也是空的。

例如,如果我想以显示每个对象:

name field1 field2 

我获得以下数组$objects

nameExample field1Example field2Example 
nameExample field1Example field2Example 
nameExample field1Example 
nameExample field1Example field2Example 
nameExample field1Example field2Example 

其中第三排是$object
如果我在第一个查询得到FIELD2它也是在第二之一的getResult可见。但是,这让我控制了在整个请求中为任何实体对象接收的所有字段。

  1. 我可以犯什么错?
  2. 我怎样才能避免这种效果?我仍然想使用不与多维数组对象的对象(至于HYDRATE_ARRAY
  3. 有没有一种方法可以强制原则总是使实体对象不与代理对象结合?

在此先感谢您。

回答

2

这是因为原则保持的内部引用它返回每个实体。当您请求您之前请求的实体时,它将重新使用先前的对象。原因是如果你试图操纵它们,拥有同一个实体的两个不同副本将会产生冲突。有关详细信息,请参阅http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/unitofwork.html#how-doctrine-keeps-track-of-objects

的一个解决方案是在执行第二次查询前脱离你得到第一个实体(使用$em->detach($object)$em->clear())。 请注意,您所做的任何未被刷新的更改都将消失。

另一种选择是,要么刷新使用$em->refresh($object)实体(这将导致它被完全加载),或告诉学说,它需要刷新所有实体的第二个查询:

$query = $this->getDoctrine()->getManager()->createQuery('SELECT PARTIAL o.{id,name,field1, field2} FROM SomeBundle:SomeEntity o '); 
$query->setHint(Query::HINT_REFRESH, true); 
$objects = $query->getResult(); 

这将使主义刷新它为第二个查询找到的所有实体。

+0

谢谢你的答案。我之前考虑过类似的解决方案,但是当您查询具有一次到多次关联的实体时,在一个查询示例中也会出现此问题,这种关联会对其他实体进行两次。在这种情况下,你不能分离对象,也不能清除em,因为它在同一个查询中。你怎么看待这件事? –

+0

你是什么意思,“关联两次”?你是否有实体A与实体B有两种不同的关联(例如,具有'created_by'和'updated_by'字段的'News'实体都指向'User'实体)?你用某种方法加载“PARTIAL”? –

+0

我的意思是这里描述的情况:https://github.com/doctrine/doctrine2/issues/5731,所以实际上我还不够精确,因为这个问题被这种变体的关联所注意到:'A-> B - > A'。 –