2016-12-15 64 views
0

我試圖正確地加入symfony。我嘗試這裏描述Doctrine 2 - Outer join query和這裏Symfony - Using Outer Joins with Doctrine ORMRIGHT JOIN原則

$query = $em->getRepository('AppBundle:raports')->createQueryBuilder('r') 
      ->select('r') 
      ->leftJoin('r.requestRaports rr WITH rr.formId = :formId', false) 
      ->setParameter('formId', $requestId->getFormId()) 
      ->getQuery(); 

它給

SELECT 
    r0_.id AS id_0, 
    r0_.adminComment AS adminComment_1, 
    r0_.addDate AS addDate_2, 
    r0_.submitDate AS submitDate_3, 
    r0_.statusId AS statusId_4, 
    r0_.userId AS userId_5, 
    r0_.requestId AS requestId_6, 
    r0_.requestRaports AS requestRaports_7 
FROM 
    raports r0_ 
    LEFT JOIN request_raports r1_ ON r0_.requestRaports = r1_.id 
    AND (r1_.formId = ?) 

當我嘗試

$query = $em->getRepository('AppBundle:raports')->createQueryBuilder('r') 
      ->select('r') 
      ->join('r.requestRaports rr WITH rr.formId = :formId', false) 
      ->setParameter('formId', $requestId->getFormId()) 
      ->getQuery(); 

它看起來像

SELECT 
    r0_.id AS id_0, 
    r0_.adminComment AS adminComment_1, 
    r0_.addDate AS addDate_2, 
    r0_.submitDate AS submitDate_3, 
    r0_.statusId AS statusId_4, 
    r0_.userId AS userId_5, 
    r0_.requestId AS requestId_6, 
    r0_.requestRaports AS requestRaports_7 
FROM 
    raports r0_ 
    INNER JOIN request_raports r1_ ON r0_.requestRaports = r1_.id 
    AND (r1_.formId = ?) 

但我想查詢像

SELECT * FROM raports r RIGHT JOIN request_raports rr ON r。 requestRaports = rr.id

如何在doctrine2中進行正確的連接工作?

回答

0

可以醚使用LEFT JOIN和扭轉你這樣的SQL

SELECT * FROM request_raports rr LEFT JOIN raports r ON r.requestRaports = rr.id 

或者你可以創建自己的「正確連接」。如果您在學說看leftJoin的定義,它是這樣的:

leftJoin($join, $alias, $conditionType = null, $condition = null, $indexBy = null) 
{ 
    $parentAlias = substr($join, 0, strpos($join, '.')); 

    $rootAlias = $this->findRootAlias($alias, $parentAlias); 

    $join = new Expr\Join(
     Expr\Join::LEFT_JOIN, $join, $alias, $conditionType, $condition, $indexBy 
    ); 

    return $this->add('join', array($rootAlias => $join), true); 
} 

因此,它可能看起來像這樣:

$qb = $this->createQueryBuilder('b'); 

$rightJoin = new Expr\Join('RIGHT', 'r.requestRaports', 'rr', Expr\Join::WITH, 'rr.formId = :formId'); 
$qb 
    ->select('r') 
    ->add('join', ['r' => $rightJoin], true) 
    ... 

我沒有測試過這一點,不知道它的最好方式做它...