我有两个关系的合作伙伴实体:
/**
* @var PartnerSettings
* @ORM\OneToOne(targetEntity="PartnerSettings", mappedBy="partner", cascade={"persist", "remove"}, fetch="LAZY")
*/
private $settings;
/**
* @var PartnerRating
* @ORM\OneToOne(targetEntity="PartnerRating", mappedBy="partner", cascade={"persist", "remove"}, fetch="LAZY")
*/
private $rating;
... getRepository(Partner :: class) - > findAll()正常工作,进行了一次查询,但是当我创建queryBuilder时:
return $this->createQueryBuilder('p')
->getQuery()
->getResult();
doctrine make 31个查询(我有10个合作伙伴)...在调试工具栏中,我看到了对每个合作伙伴的设置和评级的选择查询。在这种情况下我不想要它。 此外,在我使用加入合作伙伴的每个查询构建器中,也会选择设置和评级。
答案
->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true);
完成了这项工作
答案 0 :(得分:1)
此行为称为N + 1 selects problem。要减少数据库查询,您可能需要考虑以下方法。
首先,检索所有合作伙伴:
$partners = $em->createQueryBuilder()
->select("p")
->from("Parent", "p")
->where(/*...*/)
->setParameter(/*...*/)
->indexBy("p.id")
->getQuery()->getResult();
现在一次加载所有孩子,在两个查询中:
$settings = $em->createQueryBuilder()
->select("s")
->from("PartnerSetting", "s")
->where("IDENTITY(s.partner) IN (?1)")
->setParameter(1, array_keys($partners))
->getQuery()->getResult();
$ratings = $em->createQueryBuilder()
->select("r")
->from("PartnerRating", "r")
->where("IDENTITY(r.partner) IN (?1)")
->setParameter(1, array_keys($partners))
->getQuery()->getResult();
Doctrine现在将所有检索到的实体存储在内存中。因此,例如,当您执行$parnter->getRatings()
时,不会触发新的数据库查询,而是从内存中填充实体。
答案 1 :(得分:0)
刚刚映射的关系:@ORM\OneToOne(targetEntity="ENTITY", mappedBy="MAPPEDBY", fetch="EAGER")
答案 2 :(得分:0)
只需定义表和选择中的关系
$ qb-> select('g','gi');
现在可以使用