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

van*_*van 5 php proxy doctrine join symfony

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

它有点像以下声明:

SELECT a, b FROM A a LEFT JOIN B b ON a.id = b.aid GROUP BY a.id;
Run Code Online (Sandbox Code Playgroud)

或在代码中:

$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();
Run Code Online (Sandbox Code Playgroud)

现在的问题是,只要A没有实体B,Doctrine就会返回A的代理对象.因为我使用反射,我需要真正的对象而不是代理.

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

商店实体(A)是代理商

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

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

编辑:附上截图

Mar*_*tis 1

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

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

但正如我从你的截图中看到的,你错误地识别了这个问题。如果您选择a第一个(如您的示例中所示),那么结果列表中将没有代理。

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