2013-10-04 15 views
27

Używam Doctors Builder w Symfony2, aby utworzyć zapytanie do pobierania encji.Warunek łączenia lewy ON I składnia warunek inny w Doctrine

Mój bieżący kod wygląda następująco:

$repository = $this->getDoctrine()->getRepository('AaaBundle:Application'); 

    $queryBuilder = $repository->createQueryBuilder('a'); 
    $queryBuilder 
     ->addSelect('u') 
     ->addSelect('i') 
     ->orderBy('a.created_date', 'DESC') 
     ->leftJoin('a.created_by', 'u') 
     ->leftJoin('a.installations', 'i') 
     //->where('i.page = :page') 
     //->setParameter('page', $found) 
     ; 

Teraz mogę to wykorzystać, aby uzyskać wszystkie strony, niezależnie od ich konieczności instalacji czy nie. Ale chcę tylko dołączyć do nich, jest dostępna strona $found (tak, że jeśli jest instalacja dla aplikacji, ale jest na innej stronie, instalacja nie będzie dołączona). Jeśli dodaję klauzul where, będą wyświetlane tylko aplikacje z instalacją strony. Chcę wszystkie aplikacje z lub bez instalacji dla strony.

W SQL można uzyskać to poprzez dodanie AND do łączenia

LEFT JOIN installations i ON a.id = i.app AND i.page = :page 

ten sposób uzyskać informacje o instalacji dla aplikacji, która ma instalację na stronie, ale pojawia się wartości null w kolumnach dla aplikacje, które mają instalacje na innych stronach lub wcale.

Czy jest jakiś sposób, aby to zrobić w Doctrine, czy lepiej byłoby po prostu uzyskać wszystkie instalacje dla każdej aplikacji, a następnie sprawdzić na stronie z php?

Odpowiedz

54

Można spróbować to:

use Doctrine\ORM\Query\Expr; 

->leftJoin('a.installations', 'i', Expr\Join::WITH, 'i.page = :page') 
->setParameter('page', $page) 

patrz funkcja leftJoin w Doc: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/query-builder.html#high-level-api-methods

+0

Używam DQL zamiast, a WITH słowo kluczowe może być stosowany również tam, zaraz po klauzuli przyłączenia. –

+2

Możesz oprzeć się bardziej na konstruktorze zapytań w ten sposób. '-> leftJoin ('a.installations', 'i', Expr \ Join :: WITH, $ qb-> expr() -> eq ('i.page', ': page')) -> setParameter ('strona', $ strona); ' –

+0

W celu dokładności:" Expr \ join "pochodzi z" Doctrine \ ORM \ Query \ Expr " – Delphine