Utiliser GROUP BY day, month, year sous doctrine2
En temps normal il est simple de grouper des données séléctionnées via une requête MySQL par jour, mois, année ou par heure par exemple (du moins lorsque vous enregistrez bien vos date en "datetime"). Il suffit en effet d'utiliser "GROUP BY day(date)" et le tour est joué. Sauf si vous utilisez Doctrine 2, avec Symfony par exemple, où il n'est en effet pas possible d'utiliser la fonction "day(...)".
Il faut donc trouvé un subterfuge permettant de tout de même extraire le jour (entre autre) de la date.
Je vous propose une solution qui est d'utiliser la fonction SUBSTRING() qui elle est fonctionnelle sous Doctrine 2. Cette fonction permet de sélectionner seulement une partie d'une chaine de caractère. Les datetime sont enregistrées avec le format suivant : YYYY-MM-DD HH:II:SS (ou AAAA-MM-JJ HH:MM:SS si vous préférez), il est donc possible d'en extraire uniquement ce que l'on veux.
Voici un exemple concret d'une requête regroupant les données par jours :
$query = $this->createQueryBuilder('v') ->select('count(v) as nb, SUBSTRING(v.date, 9, 2) as day') ->groupBy('day') ->orderBy('v.date', 'ASC')
En soit la fonction SUBSTRING(chaine, début, longueur) extrait de v.date 2 caractères en commençant par la position 9. Attention c'est un peu particulier la position 9 correspond au premier D de la chaine "YYYY-MM-DD HH:II:SS", et la longueur inclus le caractère de la position de départ.
Le jour est ensuite enregistré dans une variable appelée "day" qui est ensuite utilisée dans la méthode GROUP BY.
Pas plus compliqué que ça, cette astuce permet aussi d'extraire l'heure, le mois, l'année ... en modifiant correctement les valeurs de SUBSTRING().
Par Guillaume le 08/02/2014 à 02:22