【发布时间】:2014-11-08 17:13:08
【问题描述】:
我正在尝试从一个与另一个类连接的类中检索实体。 并非所有实体实际上都加入了实体。
有点像下面的语句:
SELECT a, b FROM A a LEFT JOIN B b ON a.id = b.aid GROUP BY a.id;
或在代码中:
$query_builder = $em->getRepository('repository_of_A')->createQueryBuilder('a');
$query_builder = $query_builder->leftJoin('a.b', b);
$query_builder = $query_builder->groupBy('a.id');
$query = $query_builder->select('a, b')->getQuery();
$entities = $query->getResult();
现在的问题是,只要 A 没有实体 B,Doctrine 就会为 A 返回一个代理对象。 因为我使用反射,所以我需要真实对象而不是代理。
在随附的屏幕截图中,索引为 26 的对象没有对应于 A(商店)的实体 B。
有谁知道为什么以及如何解决这个问题?
注意:我知道在使用反射时我可以只使用类名而不是实体,但我也想了解这里的问题,因为它可能会影响运行时... p>
编辑:附上截图
【问题讨论】:
-
看起来很奇怪。是否有更多的关联?无论如何,在使用 Doctrine 2 时,您需要能够处理代理。
-
实际上还有很多关联,但是查询只要求 A 和 B。好吧,我现在使用
ClassUtils::getClass(...)以确保反射仍然有效。但是,我仍然有兴趣解决这个问题.. -
其他关联将导致创建代理以支持延迟加载。我所知道的唯一解决方法是让您进行某种数据转换或制作自己的 Doctrine 2 水合器。但最好的办法是让反射代码支持代理。
-
先谢谢,但我还是不明白。其他关联可能是代理对象,但为什么我的主要实体是代理对象?我不关心其他关联,因为我只需要 A 的原始数据(以及连接实体 B 的原始数据)。因此,所有其他相关实体的代理都很好。正如我所说,我的代码甚至可以与使用 Doctrine 的 ClassUtils 的代理一起工作。
-
这 A 和 B 的东西令人困惑。 A是你的主要实体吗?如果 A 有关联(即数组集合),则 A 将作为代理返回。有多种方法可以设置您的查询,以便您只获得所需的确切属性。但这通常意味着您无法更新并将更改持久化回您的数据库。
标签: php symfony join proxy doctrine