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?
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