Bonjour,
Apparemment, sous DQL il n'est pas possible d'imbriquer des sous requêtes complexes.
Je pense tenir le bon bout mais je coince au niveau de la sous requête...
En sql ça ressemble à ça :
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 SELECT p.id as id_pays, pn.nom as nom, pnc.nomclassement as nomclassement, pi.initiale as initiale FROM Pays as p JOIN Paysnomclassement as pnc on pnc.pays_id = p.id JOIN PaysInitiale as pi on pi.pays_id = p.id JOIN PaysNom as pn on pn.pays_id = p.id WHERE pnc.datecreation = (SELECT max(datecreation) FROM Paysnomclassement WHERE pays_id = p.id AND visible = 1) AND pi.datecreation = (SELECT max(datecreation) as maxdate FROM PaysInitiale WHERE pays_id = p.id AND visible = 1 ) AND pn.datecreation = (SELECT max(datecreation) FROM PaysNom WHERE pays_id = p.id AND visible = 1) ORDER BY pnc.nomclassement
Cela fonctionne parfaitement.
En DQL j'en suis là :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 $em = $this->getDoctrine()->getEntityManager(); $qb = $em->createQueryBuilder(); $qb_pn = $em->createQueryBuilder(); $qb_pnc = $em->createQueryBuilder(); $qb_pi = $em->createQueryBuilder(); $qb_pn->select ('max(pn.datecreation)', 'pn') ->from('OpengenGeoBundle:PaysNom','pn'); $qb_pnc->select ('max(pnc.datecreation)', 'pnc') ->from('OpengenGeoBundle:PaysNomClassement','pnc'); $qb_pi->select ('max(pi.datecreation)', 'pi') ->from('OpengenGeoBundle:PaysNomInitiale','pi'); $qb->addSelect('p.id')->addSelect('pn.nom')->addSelect('pnc.nomclassement')->addSelect('pi.initiale'); $qb->from('OpengenGeoBundle:Pays','p'); $qb->join('OpengenGeoBundle:PaysNom','pn','WITH',' pn = p'); $qb->join('OpengenGeoBundle:PaysNomClassement','pnc','WITH',' pnc = p'); $qb->join('OpengenGeoBundle:PaysInitiale','pi','WITH',' pn = p'); $qb->andWhere($qb->expr()->eq('datecreation.pn', $qb_pn->getDQL())); $qb->andWhere($qb->expr()->eq('datecreation.pnc', $qb_pnc->getDQL())); $qb->andWhere($qb->expr()->eq('datecreation.pi', $qb_pi->getDQL())); $query = $qb->getQuery(); $listepays = $query->getArrayResult();
Le soucis se situé sur les lignes andWhere....
Les sous-requêtes testées individuellement fonctionnent bien.
La requête principale fonctionne bien dans les conditions "where"
Là j'ai un sale message d'erreur :
Pour info, je débute avec Doctrine :-(Expected Literal, got 'SELECT'
Une idée ?
Merci pour vos lumières...
Partager