原则:是否可以使用单个数据库查询预加载子/相关 N:N 实体



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

/**
 * @ORMEntity
 **/
class P {
    /** @var Collection @ORMManyToMany(targetEntity="C") */
    public $childs;
}
/**
 * @ORMEntity
 **/
class C {
    /** @var int @ORMColumn(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();

最新更新