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.
有谁知道为什么以及如何解决这个问题?
注意:我知道在使用反射时我可以使用classname而不是实体,但我也想了解这里的问题,因为它可能会影响运行时...
编辑:附上截图
如果问题是字段未加载,则在使用反射之前检查 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)-则使用它而不是代理,因为它已经加载。
归档时间: |
|
查看次数: |
1022 次 |
最近记录: |