Maxy.fr

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().

Catégories : MySql, Symfony2

Par Guillaume le 08/02/2014 à 02:22

Partager l'article :

Articles similaires

Lire plusieurs fois toutes les données récupérées avec fetch en PDO

Vous connaissez tous la méthode suivante pour lire une série de données enregistrées via MySQL : $listeRep = $bdd->query("SELECT * FROM registre ORDER BY id DESC"); while($listeData = $listeRep->fetch()) { echo $listeData['nom']; }   Vous...

Installer et utiliser l'antispam Akismet sous Symfony2

Akismet est l'un des antispam les plus utilisé notamment pour le système de commentaires des blogs Wordpress. Il permet une détection assez poussée des spams en analysant le contenu des messages ainsi que des adresses mail et noms d'utilisateurs s'il y a...

Symfony2 : Exécuter un script php au chargement des pages

Il est souvent utile suivant les besoins d'executer un script PHP lors du chargement de n'importe quelle page d'un site. Par exemple pour l'enregistrement de statistiques. Il s'avère que ceci est plutôt simple à réaliser en créant et en configurant un...