具有doctrine的查询生成器中的外连接

fre*_*dev 3 left-join outer-join query-builder symfony doctrine-orm

我有一个名为的实体PointsComptage.php,另一个名为Compteurs.php.

这是他们之间的关系:

// Compteurs.php 
/**
 * @var \PointsComptage
 *
 * @ORM\ManyToOne(targetEntity="PointsComptage", inversedBy="compteurs")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="pointscomptage_id", referencedColumnName="id")
 * })
 */
private $pointsComptage;

/**
 * @var \Doctrine\Common\Collections\Collection
 *
 * @ORM\OneToMany(targetEntity="ParametresMesure", mappedBy="compteurs")
 */
private $parametresMesure;

/*  ...  */


// PointsComptage.php
/**
 * @var \Doctrine\Common\Collections\Collection
 *
 * @ORM\OneToMany(targetEntity="Compteurs", mappedBy="pointsComptage")
 */
private $compteurs;

/*  ...  */
Run Code Online (Sandbox Code Playgroud)

这是我的存储库实体中的查询,用于恢复具有一个pointComptage属性的compteurs:

$queryBuilder = $this->_em->createQueryBuilder();

$queryBuilder
  ->select ('c')
  ->from('MySpaceMyBundle:Compteurs', 'c')
  ->leftJoin('c.pointsComptage', 'pc')
  ->join('c.parametresMesure', 'pm')
  ->join('pm.typesUnite', 'tu')
  ->join('pm.typesParametre', 'tp')
  ->where('c.pointsComptage = pc.id')
  ->andWhere('pm.compteurs = c.id')
  ->andWhere('pm.typesUnite = tu.id')
  ->andWhere('pm.typesParametre = tp.id')
  ->andWhere('c.pointsComptage = :id')
  ->add('orderBy', 'c.miseEnService', 'ASC')
  ->setParameter('id', $id);

  return $queryBuilder->getQuery()
                      ->getResult();
Run Code Online (Sandbox Code Playgroud)

问题是我为所选择的pointComptage恢复了我的compteurs,但只有那些具有parametresMesure关系的compteurs.

在我的数据库,它可能是一个compteur都没有 parametreMesure DATAS.

如何恢复没有parametresMesure的compteurs和具有parametresMesure属性的compteurs(在同一个queryBuilder中)?

我在doctrine文档中读到queryBuilder中的leftJoin像外连接一样工作.

我试图做的,是恢复所有compteurs链接到pointComptage选定的,无论是否parametresMesure.

fre*_*dev 8

我找到了解决方案.问题是我在我的Where子句中添加了条件,但我需要在我的子句中指定它们leftJoin.

这是我的代码,以了解我做了什么:

$queryBuilder = $this->_em->createQueryBuilder();

$queryBuilder
    ->select ('c')
    ->from('MySpaceMyBundle:Compteurs', 'c')
    ->leftJoin('c.pointsComptage', 'pc', 'WITH', 'pc.id = c.pointsComptage')
    ->leftJoin('c.parametresMesure', 'pm', 'WITH', 'pm.compteurs = c.id')
    ->leftJoin('pm.typesUnite', 'tu', 'WITH', 'pm.typesUnite = tu.id')
    ->leftJoin('pm.typesParametre', 'tp', 'WITH', 'pm.typesParametre = tp.id')
    ->andWhere('c.pointsComptage = :id')
    ->add('orderBy', 'c.miseEnService', 'ASC')
    ->setParameter('id', $id);

return $queryBuilder->getQuery()
                    ->getResult();
Run Code Online (Sandbox Code Playgroud)

就像这样,compteurs即使他们没有,我也会恢复所有parametresMesure.