【发布时间】:2015-06-12 18:04:50
【问题描述】:
我使用以下代码加载具有两个后续连接的实体:
$queryBuilder = $this->createQueryBuilder('a')
->leftJoin('p.entityAtoentityB', 'ab')
->leftJoin('ab.entityB', 'b')
->select('a, ab, b')
->where('a.id = :id')
->setParameter('id', (int) $id);
$queryBuilder->getQuery()->getOneOrNullResult();
如果我在 Symfony 的分析器中检查生成的查询并自己运行它,所有类型 B 的实体都会出现在结果中。
但是,如果我尝试访问 B 类型实体的数据,则只有结果中的第一个不需要额外查询,而所有其他实体将显示为(空)代理对象,直到我需要显示他们的一些数据,然后 Doctrine 将运行一个额外的查询(基于他们的主键)来加载它们,而它们已经在第一个查询中加载,如结果所示。
所以,在那个例子中,如果一个类型 A 的对象通过表 AB 链接到两个类型 B 的对象,并且上面的代码已经运行,这个循环将不会在第一次迭代中生成查询,但是它将在第二个中,使用其主键请求类型 B 的对象。
foreach ($A->getAB() as $AB) {
$AB->getB();
}
我怎样才能让 Doctrine 记住它实际上已经为所有 B 类型的对象加载了数据并且不需要第二次查询?
注意:getResult() 没有改变任何东西
【问题讨论】:
-
为什么 ">leftJoin('pao.entityB', 'b')" 中有“pao”别名?
-
应该是“ab”,现在已修复:)
标签: php symfony join doctrine-orm proxy