[Doctrine] DQL et sous-requête
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:
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:
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 :
Citation:
Expected Literal, got 'SELECT'
Pour info, je débute avec Doctrine :-(
Une idée ?
Merci pour vos lumières...