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 :

Expected Literal, got 'SELECT'
Pour info, je débute avec Doctrine :-(

Une idée ?

Merci pour vos lumières...