0

これは 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       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

表の第 2 節と第 3 節に問題がありBacます。Doctrine2 を使用してどのように実装できますか? リクエストは動的に構築されるため、ネイティブ SQL を使用できません。そのため、DQL を使用して構築する必要があります。

4

1 に答える 1

0

「任意の JOIN 構文」を使用します。

$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')
    ));

$qb->getQuery()->getSql()これが元のクエリと一致するかどうかを確認します。

于 2013-05-14T12:41:15.753 に答える