鉴于以下父子实体,当我有许多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; }
}
答案 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();