2013-10-04 16 views
27

Sto usando il querybuilder di Doctrine in Symfony2 per creare una query per recuperare le entità.Sinistra join ON condizione E altra sintassi delle condizioni in Doctrine

mio codice attuale è simile al seguente:

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

ora posso usare questo per ottenere tutte le pagine a prescindere dalla loro avendo un impianto o no. Ma voglio solo unirmi a loro è disponibile la pagina $found (in modo che se c'è un'installazione per l'app, ma è su un'altra pagina, l'installazione non sarà unita). Se annullo la clausola where, mostrerà solo le app che hanno un'installazione per la pagina. Voglio tutte le app con o senza installazioni per la pagina.

In SQL posso ottenere questo con l'aggiunta AND alla unirsi

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

In questo modo ottengo informazioni di installazione per un app che ha un impianto sulla pagina, ma ottengo valori nulli sulle colonne per app che hanno installazioni su altre pagine o per niente.

C'è un modo per fare ciò in Doctrine o sto meglio semplicemente ottenendo tutte le installazioni per ogni applicazione e quindi controllando la pagina trovata con php?

risposta

54

Si può provare questo:

use Doctrine\ORM\Query\Expr; 

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

vedi funzione leftJoin nel doc: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/query-builder.html#high-level-api-methods

+0

sto usando DQL invece, e la parola chiave WITH può essere utilizzato anche lì, subito dopo la clausola join. –

+2

È possibile appoggiare ancora di più sul generatore di query come questo. '-> leftJoin ('a.installations', 'i', Expr \ Join :: WITH, $ qb-> expr() -> eq ('i.page', ': page')) -> setParameter ('page', $ page); ' –

+0

Per motivi di precisione:" Expr \ join "deriva da" Doctrine \ ORM \ Query \ Expr " – Delphine

Problemi correlati