2016-12-15 6 views
0

Im пытается правой присоединиться к symfony. Я пробовал, как описано здесь Doctrine 2 - Outer join query и здесь Symfony - Using Outer Joins with Doctrine ORM.RIGHT JOIN doctrine

$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 ПРАВОЕ СОЕДИНЕНИЕ 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) 
    ... 

Я не проверял это и делать, если его лучший способ не знать это ...