Php 条令在连接具有可为空关系的表时返回代理对象

Php 条令在连接具有可为空关系的表时返回代理对象,php,symfony,join,proxy,doctrine,Php,Symfony,Join,Proxy,Doctrine,我试图从一个类与另一个类连接的类中检索实体。 并非所有实体实际上都有连接的实体 这有点像下面的陈述: 或在代码中: 现在的问题是,只要A没有实体B,条令就会为A返回一个代理对象。 因为我处理反射,所以我需要真实的对象而不是代理 在所附的屏幕截图中,索引为26的对象没有对应于A(商店)的实体B 有人知道我为什么以及如何解决这个问题吗 注意:我知道在使用反射时,我可以只使用类名而不是实体,但我也想理解这里的问题,因为它可能会影响运行时 编辑:附加一个屏幕截图如果问题是未加载字段,则在使用反射之

我试图从一个类与另一个类连接的类中检索实体。 并非所有实体实际上都有连接的实体

这有点像下面的陈述:

或在代码中:

现在的问题是,只要A没有实体B,条令就会为A返回一个代理对象。 因为我处理反射,所以我需要真实的对象而不是代理

在所附的屏幕截图中,索引为26的对象没有对应于A(商店)的实体B

有人知道我为什么以及如何解决这个问题吗

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


编辑:附加一个屏幕截图

如果问题是未加载字段,则在使用反射之前检查是否加载了实体,否则加载:

if (
    $object instanceof \Doctrine\Common\Persistence\Proxy
    && !$object->__isInitialized()
) {
    $object->__load();
}
// ... your code
但正如我从你的截图上看到的,你已经错误地识别了这个问题。如果先选择
a
(如示例中所示),则结果列表中将没有代理


正如我猜想的那样,在您的示例中,所有商店实体都处于某种关联中(不是通过查询选择的,而是例如从
$country->getShops();
),并且
Shop[70]
不是代理,只是因为在该点之前的某个地方已经加载了它。若实体在映射中(按ID)-它被用来代替代理,因为它已经被加载。

似乎很奇怪。a还有什么关联吗?在任何情况下,当使用原则2时,您需要能够处理代理。实际上有更多的关联,但查询只要求a和B。好的,我现在使用
ClassUtils::getClass(…)
来确保反射仍然有效。但是,我仍然对解决这个问题感兴趣。其他关联将导致创建代理以支持延迟加载。据我所知,唯一的解决办法就是让你做一些数据转换,或者制作你自己的信条2。但是你最好的办法是让你的反射代码支持代理。好吧,首先是thx,但我还是不明白。。其他关联可能是代理对象,但为什么我的主实体是代理对象?我不关心其他关联,因为我只需要A的基本数据(以及连接实体B的基本数据)。因此,所有其他相关实体的代理都很好。正如我所说,我的代码甚至可以与使用原则的ClassUtils的代理一起工作。A是您的主要实体吗?如果A具有关联(即数组集合),则A将作为代理返回。有几种方法可以设置查询,以便只获得所需的确切属性。但这通常意味着您无法更新并将更改保留回数据库。实际上,我使用DQL语句让所有商店加入他们的注释,类似于上面描述的注释。屏幕截图显示了该查询给出的结果集。这就是我不理解代理对象的原因。
$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();
if (
    $object instanceof \Doctrine\Common\Persistence\Proxy
    && !$object->__isInitialized()
) {
    $object->__load();
}
// ... your code