web-dev-qa-db-fra.com

Condition de jointure gauche ON ET autre syntaxe de condition dans Doctrine

J'utilise le constructeur de requêtes de Doctrine dans Symfony2 pour créer une requête pour récupérer des entités.

Mon code actuel ressemble à ceci:

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

Maintenant, je peux l'utiliser pour obtenir toutes les pages, qu'elles aient ou non une installation. Mais je veux seulement les rejoindre le $found la page est disponible (de sorte que s'il y a une installation pour l'application, mais qu'elle se trouve sur une autre page, l'installation ne sera pas jointe). Si je ne cite pas la clause where, elle n'affichera que les applications qui ont une installation pour la page. Je veux toutes les applications avec ou sans installations pour la page.

En SQL, je peux obtenir cela en ajoutant AND à la jointure

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

De cette façon, j'obtiens les informations d'installation pour une application qui a une installation sur la page, mais j'obtiens des valeurs nulles dans les colonnes pour les applications qui ont des installations sur d'autres pages ou pas du tout.

Existe-t-il un moyen de le faire dans Doctrine ou est-ce que je ferais mieux de simplement obtenir toutes les installations pour chaque application, puis de vérifier la page trouvée avec php?

33
juuga

Vous pouvez essayer ceci:

use Doctrine\ORM\Query\Expr;

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

Voir la fonction leftJoin dans le doc: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/query-builder.html#high-level-api-methods

65
zapcost