gpt4 book ai didi

symfony - Doctrine2 - getResult 中常规对象中的代理对象

转载 作者:行者123 更新时间:2023-12-02 11:14:07 29 4
gpt4 key购买 nike

在我的 Symfony2 Controller 中,我有两个查询:
就像这个例子一样:

$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 值。事实上,如果我在与该 Controller 一起启动的任何其他 Controller 中获取此 $object,则每次对该对象的引用时,field2 也将为 null。

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

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. 有没有办法强制原则始终通过实体对象而不是代理对象产生?

提前谢谢您。

最佳答案

发生这种情况是因为 Doctrine 保留了对其返回的每个实体的内部引用。当您请求之前请求过的实体时,它将重新使用以前的对象。这样做的原因是,如果您尝试同时操作同一实体的两个不同副本,则会产生冲突。更多详情请参见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) 刷新实体(这将导致其完全加载)或告诉 Doctrine 它需要刷新第二个实体查询:

$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();

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

关于symfony - Doctrine2 - getResult 中常规对象中的代理对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40691531/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com