Bonjour,
Je cherche à mettre des conditions sur des jointures avec doctrine, mais pour l'instant je ne trouve pas comment procéder.
En SQL je procede de la sorte :
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 SELECT DISTINCT p.nom FROM personnes p INNER JOIN groupes g INNER JOIN formations f INNER JOIN evenement e ON ( p.id = g.id_personne AND g.id IN (1,2,3) ) OR ( p.id = f.id_personne AND f.id IN (1,2,3) ) OR ( p.id = e.id_personne AND e.id IN (1,2,3) )
Le but avec un OR et de filtrer les personnes ayant participé à une formation ou appartenant à tel groupe ou encore ayant participé à un événement.
Avec un AND la requête filtrerais les personnes ayant participé à un évenement et appartenant à une formation et ayant participé à un évènement, donc plus restrictif.
Avec Doctrine lorsque je fais ce genre de requete :
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 SELECT DISTINCT ent FROM Admin\Entity\PrivateDetails ent JOIN ent.events evs JOIN ent.groups grp JOIN ent.formations for WITH ( evs IN (?1) OR grp IN (?2) OR for IN (?3) )
J'utilise la clause WITH pour avoir le ON à la fin de la requête. Mais lorsque doctrine me génère la requête finale je n'ai pas une clause ON unique à la fin comme je le souhaiterais pour que ma requête donne le résultat voulu.
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 SELECT DISTINCT * FROM private_details p0_ INNER JOIN private_details_event p2_ ON p0_.id = p2_.private_details_id INNER JOIN event e1_ ON e1_.id = p2_.event_id AND (e1_.del = 0) INNER JOIN private_details_group p4_ ON p0_.id = p4_.private_details_id INNER JOIN groupes g3_ ON g3_.id = p4_.group_id AND (g3_.del = 0) INNER JOIN private_details_formation p6_ ON p0_.id = p6_.private_details_id INNER JOIN formation f5_ ON f5_.id = p6_.formation_id AND (f5_.del = 0) AND ((e1_.id IN (?) OR g3_.id IN (?) OR f5_.id IN (?)))
Existe il une solution pour obtenir une condition uniquement à la fin de la requête comme dans le premier exemple ?
Partager