Symfony 如何在Doctrine2中编写此查询?(子查询和联接)
这是我想使用Doctrine2实现的查询:Symfony 如何在Doctrine2中编写此查询?(子查询和联接),symfony,doctrine,dql,Symfony,Doctrine,Dql,这是我想使用Doctrine2实现的查询: SELECT d1_.codeLieu AS codeLieu1, d1_.nomLieu AS nomLieu2, d1_.lngLieu AS lngLieu3, d1_.latLieu AS latLieu4, m2_.libelleMention AS libelleMention5, t3_.libelleType AS libelleType6, COUNT( b0_.id ) AS sclr0 FROM Delegation
SELECT d1_.codeLieu AS codeLieu1, d1_.nomLieu AS nomLieu2, d1_.lngLieu AS lngLieu3, d1_.latLieu AS latLieu4, m2_.libelleMention AS libelleMention5, t3_.libelleType AS libelleType6, COUNT( b0_.id ) AS sclr0
FROM Delegation d1_
INNER JOIN EtablissementBac e5_ ON e5_.delegation_id = d1_.codeLieu
INNER JOIN TypeBac t3_
INNER JOIN MentionBac m2_
LEFT JOIN Bac b0_
ON b0_.etabBac_id = e5_.codeLieu -- 1st clause
AND b0_.typeBac_id = t3_.codeType -- 2nd clause
AND b0_.mentionBac_id = m2_.codeMention -- 3rd clause
WHERE m2_.codeMention IN ('TB', 'B')
AND t3_.codeType IN ('114', '129')
AND d1_.codeLieu IN('01','02','03','38','49','58')
GROUP BY d1_.codeLieu, m2_.codeMention, m2_.libelleMention, t3_.codeType, t3_.libelleType, t3_.abbrType
ORDER BY d1_.codeLieu ASC , b0_.mentionBac_id ASC , b0_.typeBac_id ASC
我对Bac
表的第2和第3条有点问题。有没有想过如何使用Doctrine2实现它?因为请求是动态生成的,所以我不能使用本机SQL,这就是为什么我需要使用DQL来生成它。使用“任意连接语法”
执行
$qb->getQuery()->getSql()
以查看此查询是否与原始查询匹配。有人可以帮助我吗?您希望输出什么?一个物体?一个标量结果数组?这不是一个困难的查询。数组数组(如选择部分)
$qb
->select(array('d.codeLieu', 'd.nomLieu', 'd.lngLieu', 'd.latLieu', 'm.libelleMention', 't.libelleType', 'COUNT(b.id) AS sclr'))
->from('PFA\SIGBundle\Entity\Delegation', 'd')
->innerJoin('PFA\SIGBundle\Entity\EtablissementBac', 'e', \Doctrine\ORM\Query\Expr\Join::WITH, $qb->expr()->eq('IDENTITY(e.delegation)', 'd.codeLieu'))
->innerJoin('PFA\SIGBundle\Entity\TypeBac', 't')
->innerJoin('PFA\SIGBundle\Entity\MentionBac', 'm')
->leftJoin('PFA\SIGBundle\Entity\Bac', 'b', \Doctrine\ORM\Query\Expr\Join::WITH, $qb->expr()->andX(
$qb->expr()->eq('IDENTITY(b.etabBac)', 'e.codeLieu'),
$qb->expr()->eq('IDENTITY(b.typeBac)', 't.codeType'),
$qb->expr()->eq('IDENTITY(b.mentionBac)', 'm.codeMention')
))
->where( $qb->expr()->andX(
$qb->expr()->in('m.codeMention', ':codeMention'),
$qb->expr()->in('t.codeType', ':codeType'),
$qb->expr()->in('d.codeLieu', ':codeLieu')
))
->groupBy('d.codeLieu')
->addGroupBy('m.codeMention')
->addGroupBy('m.libelleMention')
->addGroupBy('t.codeType')
->addGroupBy('t.libelleType')
->addGroupBy('t.abbrType')
->orderBy('d.codeLieu', 'ASC')
->addOrderBy('m.codeMention', 'ASC')
->addOrderBy('t.codeType', 'ASC')
->setParameters(array(
'codeMention' => array('TB', 'B'),
'codeType' => array('114', '129'),
'codeLieu' => array('01', '02', '03', '38', '49', '58')
));