Doctrine:是否可以使用单个数据库查询预加载 child/related N:N 个实体?

Doctrine: Is it possible to preload child/related N:N entities with single DB query?

给定以下父子实体,当我有许多 P(已加载)实体时,如何仅使用单个数据库查询预加载所有子 C 实体?

/**
 * @ORM\Entity
 **/
class P {
    /** @var Collection @ORM\ManyToMany(targetEntity="C") */
    public $childs;
}

/**
 * @ORM\Entity
 **/
class C {
    /** @var int @ORM\Column(type="integer") **/
    public $v;
}


测试用例,此代码在预加载后不应发出任何额外的数据库查询。

foreach ($ps as $p) {
    foreach ($p->childs as $child) { $dummy = $child->v; }
}

以下查询在一个查询中预加载所有 N:N 个子实体。

注意:对于非预加载数据,性能仅比 foreach 好 0.5 倍左右。可能是因为 P 实体(在我的应用案例中)包含很多字段。

$em->createQueryBuilder()->select('p', 'c')
        ->from(P, 'c')
        ->leftJoin('l.childs', 'c') // preload
        ->where('p.id IN (:ps)')->setParameter('ps', $ps)
        ->getQuery()->getResult();