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();
给定以下父子实体,当我有许多 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();