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.
我找到了解决方案.问题是我在我的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.
| 归档时间: |
|
| 查看次数: |
6643 次 |
| 最近记录: |