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

时间:2018-04-10 10:07:54

标签: doctrine-orm orm doctrine preload

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

/**
 * @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; }
}

1 个答案:

答案 0 :(得分:0)

以下查询在一个查询中预加载所有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();