【问题标题】:Entities need to be fetched twice with double join in Doctrine实体需要在 Doctrine 中使用双重连接获取两次
【发布时间】: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


【解决方案1】:

尝试以下(第 4 行更改)。您不应该使用逗号分隔的别名将单个字符串传递给“select”方法。而是传递多个字符串参数。

1 $queryBuilder = $this->createQueryBuilder('a')
2    ->leftJoin('p.entityAtoentityB', 'ab')
3    ->leftJoin('ab.entityB', 'b')
4    ->select('a', 'ab', 'b')
5    ->where('a.id = :id')
6    ->setParameter('id', (int) $id);
7
8 $queryBuilder->getQuery()->getOneOrNullResult();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2017-10-07
    相关资源
    最近更新 更多