我正在尝试从一个与另一个类连接的类中检索实体。 并非所有实体实际上都已加入实体。
它有点像以下声明:
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.
有谁知道为什么以及如何解决这个问题?
注意:我知道在使用反射时我可以使用类名而不是实体,但我也想了解这里的问题,因为它可能影响运行时...
编辑:附上截图
答案 0 :(得分:0)
如果问题是没有加载字段,那么在使用反射之前检查Doctrine是否加载了实体并以其他方式加载:
if (
$object instanceof \Doctrine\Common\Persistence\Proxy
&& !$object->__isInitialized()
) {
$object->__load();
}
// ... your code
但是,正如我从您的屏幕截图中看到的那样,您错误地识别了该问题。如果您先选择a
(如您的示例所示),则结果列表中将不会有代理。
正如我猜测的那样,在您的示例中,所有Shop实体都处于某种关联状态(未通过查询选择,但是例如来自$country->getShops();
)而Shop [70]
不是代理,因为在该点之前的某处Doctrine已经加载了它。如果实体在地图中(通过ID) - 它已经被用来代替代理,因为它已经被加载了。