当使用可空关系连接表时,Doctrine返回代理对象

时间:2014-09-15 08:20:33

标签: php symfony join proxy doctrine

我正在尝试从一个与另一个类连接的类中检索实体。 并非所有实体实际上都已加入实体。

它有点像以下声明:

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.

Shop Entity (A) is a Proxy

有谁知道为什么以及如何解决这个问题?

注意:我知道在使用反射时我可以使用类名而不是实体,但我也想了解这里的问题,因为它可能影响运行时...

编辑:附上截图

1 个答案:

答案 0 :(得分:0)

如果问题是没有加载字段,那么在使用反射之前检查Doctrine是否加载了实体并以其他方式加载:

if (
    $object instanceof \Doctrine\Common\Persistence\Proxy
    && !$object->__isInitialized()
) {
    $object->__load();
}
// ... your code

但是,正如我从您的屏幕截图中看到的那样,您错误地识别了该问题。如果您先选择a(如您的示例所示),则结果列表中将不会有代理。

正如我猜测的那样,在您的示例中,所有Shop实体都处于某种关联状态(未通过查询选择,但是例如来自$country->getShops();)而Shop [70]不是代理,因为在该点之前的某处Doctrine已经加载了它。如果实体在地图中(通过ID) - 它已经被用来代替代理,因为它已经被加载了。