Utiliser les fonctions de date SQL avec doctrine2 et symfony2

Merci à Florent Viel pour m’avoir refilé le tips (c’est un tueur) !

Grâce à SQL, il est possible de manipuler des dates en utilisant les fonction MONTH(), MINUTE(), etc… plus d’info sur les manipulations de dates en SQL.

Cependant, il est parfois utile de pouvoir les utiliser dans doctrine (par exemple comme dans mon cas en travaillant sur Symfony2 (v2.3 à l’heure où j’écris ce billet)). Avant de pouvoir les utiliser facilement comme dans cet exemple :

$qb = $this->createQueryBuilder('p')
            ->select('count(p) as activity, hour(p.created_at) as hour, dayofweek(p.created_at) as journey')
            ->groupBy('hour, journey');

Il est nécessaire de faire un petit prérequis qui indiquera à doctrine comment utiliser ces fonctions jusqu’à lors inconnues pour lui.

Dans un dossier DQL dans mon bundle (par exemple), créer un fichier Month.php qui renseigne comment parser un format date

<?php

namespace YourApp\YourBundle\DQL;

use Doctrine\ORM\Query\AST\Functions\FunctionNode;
use Doctrine\ORM\Query\Lexer;
use Doctrine\ORM\Query\Parser;
use Doctrine\ORM\Query\SqlWalker;

/**
 * DateFunction ::= "HOUR" "(" ArithmeticPrimary ")"
 */
class Month extends FunctionNode
{
    public $dateExpression;

    public function parse(Parser $parser)
    {
        $parser->match(Lexer::T_IDENTIFIER);
        $parser->match(Lexer::T_OPEN_PARENTHESIS);
        $this->dateExpression = $parser->ArithmeticPrimary();
        $parser->match(Lexer::T_CLOSE_PARENTHESIS);
    }

    public function getSql(SqlWalker $sqlWalker)
    {
        return 'MONTH(' .
            $this->dateExpression->dispatch($sqlWalker) .
        ')';
    }
}

Ensuite, dans le fichier de config config.yml de votre application, rajoutez les différentes fonctions que vous souhaitez utiliser :

doctrine:
    orm:
        entity_managers:
                dql:
                    datetime_functions:
                        date: YourApp\YourBundle\DQL\Date
                        hour: YourApp\YourBundle\DQL\Hour
                        month: YourApp\YourBundle\DQL\Month

A partir de là, vous pourrez utiliser vos fonctions de manipulation de dates comme en SQL.

A propos de François Deléglise

Attiré par le multimédia depuis de nombreuses années, j'ai découvert le référencement lors d'un stage de fin d'études en IUT GEii (Lyon, 2008), je suis passionné par le SEO depuis cette date. Je suis diplômé en développement Web (licence MIW de Gap, 2010) et en gestion de projet (Master2 Ingémédia, Toulon, 2012).

Depuis la fin de mes études, je travaille avec l'équipe de Wanadev (Lyon) en tant que chef de projet, développeur symfony2 et référenceur.

3 thoughts on “Utiliser les fonctions de date SQL avec doctrine2 et symfony2

  1. Bastien says:

    Bonjour François,

    Merci beaucoup pour l’astuce. Juste pour info, sous Symfony2.3.4, la syntaxe du config.yml est la suivante :

    doctrine:
    ….
    orm:
    ….
    entity_managers:
    default:
    auto_mapping: true
    dql:
    datetime_functions:
    date: Joggin\Bundle\FrontendBundle\DQL\Date

    Il faut donc rajouter une clé « default » qui n’est pas présente dans ton fichier.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">