Bonjour,

Sous doctrine 1.2.x il existe un problème avec les Hydrations concernant les group by.

En prenant une table simple :

demandes ( id_demande, date_demande )

Pour effectuer le comptage des demandes sur une année la requête est :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
SELECT date_part('year',date_demande) as Annee, COUNT(id_demande) as NombreDeDemande 
FROM demandes
GROUP BY Annee;
Or Doctrine 1.2.x pour pouvoir construire une collection requiert d'intégrer la clef primaire de la table, la requête devient donc :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
SELECT id_demande, date_part('year',date_demande) as Annee, COUNT(id_demande) as NombreDeDemande 
FROM demandes
GROUP BY Annee;
Je précise que cet automatisme ne peut être empêché que si l'on désactive l'hydration ce qui rend de fait inutile un ORM.

Le moteur SQL MySQL ne bloquera pas cette requête ce qui est aberrant.
Par contre le moteur Postgres nous indiquera qu'il faut que le champ id_demande soit présent dans la clause GROUP BY ou être utilisé dans une fonction d'agrégat.

Alors ma question est suis je le seul dans ce cas ou avais vous trouvé une parade ? (autre que de désactiver l'hydration)

Une solution que j'utilise est de créer des vues pour ces requêtes particulières mais ça devient vraiment pénible.

Une idée qui pourrait permettre d'apporter un correctif serait de prendre un identifiant généré automatiquement (md5 + adresse mac serveur + random_number ou uuid() ) dès lors que l'on utilise une fonction d'agrégat et que l'on ne spécifie pas dans la clause SELECT DQL l'identifiant de la table.