外加入查询生成器与学说
outer join in a query builder with doctrine
我有一个名为 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;
/* ... */
这是我的存储库实体中的查询,用于恢复 compteurs 及其属性一分Comptage:
$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();
问题是我很好地恢复了我选择的pointComptage的compteurs,但只有具有parametresMesure关系的compteurs。
在我的数据库中,可能 compteur not parametreMesure 数据。
如何恢复没有parametresMesure的compteurs和有parametresMesure属性的compteurs(在同一个queryBuilder中)?
我在 doctrine 文档中读到,queryBuilder 中的 leftJoin 的工作方式类似于外部联接。
我正在尝试做的是恢复所有链接到 pointComptage
的 compteurs
选择,无论是否 parametresMesure
.
我找到了解决办法。问题是我在 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();
像这样我恢复了我所有的compteurs
,即使他们没有parametresMesure
。
我有一个名为 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;
/* ... */
这是我的存储库实体中的查询,用于恢复 compteurs 及其属性一分Comptage:
$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();
问题是我很好地恢复了我选择的pointComptage的compteurs,但只有具有parametresMesure关系的compteurs。
在我的数据库中,可能 compteur not parametreMesure 数据。
如何恢复没有parametresMesure的compteurs和有parametresMesure属性的compteurs(在同一个queryBuilder中)?
我在 doctrine 文档中读到,queryBuilder 中的 leftJoin 的工作方式类似于外部联接。
我正在尝试做的是恢复所有链接到 pointComptage
的 compteurs
选择,无论是否 parametresMesure
.
我找到了解决办法。问题是我在 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();
像这样我恢复了我所有的compteurs
,即使他们没有parametresMesure
。