2015-03-11 4 views
-1

Я ищу эквивалент этого утверждения SQL SELECT в Doctrine Query Builder:Symfony2.3 Doctrine Query Builder сложный запрос

SELECT p.* 
FROM position p, fonction f 
WHERE ((p.id = f.position_id) AND (p.type ='MONO_MEMBRE') AND (f.date_fin IS NOT NULL)) 
OR (p.type='MULTI_MEMBRE') 

Я попробовал этот путь:

function(PositionRepository $er) { 
    return $er->createQueryBuilder('p') 
     ->leftJoin('p.fonctions', 'f', 'WITH', '(f.dateFin IS NOT NULL) AND (p.type= :type_mono)') 
     ->orWhere('p.type = :type_multi') 
     ->setParameters(array(
      'type_multi' => 'MULTI_MEMBRE', 
      'type_mono' => 'MONO_MEMBRE' 
      )); 
} 

It не возвращает ожидаемые результаты. Кто-нибудь может мне помочь? Спасибо за ваше время заранее.

+0

Каковы ожидаемые результаты? – DevDonkey

+0

Спасибо за быстрый ответ. ожидаемые результаты следующие: либо тип позиции «MULTI_MEMBRE» , либо это «MONO_MEMBRE», и нет никакой «привязки», связанной с позицией с NULL как «dateFin». Я думаю, что оператор SQL может объяснить более четко. –

ответ

0

Я следовал за doctrine documentation on the QueryBuilder, и я нашел решение. Вот он:

function(PositionRepository $er) { 
    $qb= $er->createQueryBuilder('p') 
      ->leftJoin('p.fonctions', 'f'); 

    $andModule = $qb->expr()->andX(); 
    $andModule->add($qb->expr()->isNotNull('f.dateFin')); 
    $andModule->add($qb->expr()->eq('p.type', ':mono'));  

    return $qb->where('f IS NULL') 
       ->orWhere('p.type = :multi') 
       ->orWhere($andModule) 
       ->setParameters(array(
       'mono' => 'MONO_MEMBRE', 
       'multi' => 'MULTI_MEMBRE' 
       )); 
} 
0

Это должно быть эквивалентно.

return $er->createQueryBuilder('p') 
    ->leftJoin('p.fonctions', 'f') 
    ->where('p.type = :mono') 
    ->andWhere('f.date_fin IS NOT NULL') 
    ->orWhere('p.type = :muli') 
    ->setParameter(['mono' => 'MONO_MEMBRE', 'multi' => 'MULTI_MEMBRE']); 
+0

Спасибо за ответ. Это эквивалентно заявлению SQL, которое я опубликовал. Но это исключает «позиции», которые не связаны с «связью». –

+0

вы уверены? Левое соединение должно возвращать все позиции независимо от того, имеет ли положение координату или нет. – Markus

+0

Справа. Но с условием «f.dateFin IS NOT NULL» он не возвращает какую-либо позицию, которая имеет тип «MONO_MEMBRE» как тип и не имеет никакой привязки к ней. –

Смежные вопросы