Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > ORM > Doctrine
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/09/2011, 11h54   #1
Membre régulier
 
Homme Julien SIMON
Ingénieur systèmes et réseaux
Inscription : février 2006
Messages : 100
Détails du profil
Informations personnelles :
Nom : Homme Julien SIMON
Âge : 26
Localisation : France

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Transports

Informations forums :
Inscription : février 2006
Messages : 100
Points : 99
Points : 99
Par défaut Le GROUP BY de doctrine à revisiter

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 :
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 :
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.
MightyDucks est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h50.


 
 
 
 
Partenaires

Hébergement Web