Doctrine OneToOne总是加载在querybuilder上

时间:2018-02-27 12:30:44

标签: symfony doctrine-orm doctrine symfony4

我有两个关系的合作伙伴实体:

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

完成了这项工作

3 个答案:

答案 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');

现在可以使用