Utiliser une fonction DATE() dans une clause WHERE avec DQL

j'obtiens une erreur étrange quand j'exécute cette requête DQL:

SELECT u FROM User u LEFT JOIN u.schedule s WHERE DATE(s.timestamp) = DATE(NOW())

L'exception est lancée par la Doctrine avec le message:

Expected known function, got 'DATE'

Le problème ressemble à ce bug, mais qui adresse la fonction DATE () dans un groupe par clause et le bug est fermé pour la Doctrine 2.2. En ce moment, j'obtiens l'exception avec la doctrine 2.4-DEV.

la requête est destinée à sélectionner tous les utilisateurs prévus pour aujourd'hui. Est-il possible que je peux créer cette DQL? J'ai testé la version SQL dans phpMyAdmin et là la requête ne soulève pas d'erreur. Ce qui ne va pas?

13
demandé sur j0k 2012-11-07 18:58:11

1 réponses

vous pouvez obtenir ce que vous voulez en utilisant un personnel de la fonction:

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

class DateFunction extends FunctionNode
{
    private $arg;

    public function getSql(SqlWalker $sqlWalker)
    {
        return sprintf('DATE(%s)', $this->arg->dispatch($sqlWalker));
    }

    public function parse(Parser $parser)
    {
        $parser->match(Lexer::T_IDENTIFIER);
        $parser->match(Lexer::T_OPEN_PARENTHESIS);

        $this->arg = $parser->ArithmeticPrimary();

        $parser->match(Lexer::T_CLOSE_PARENTHESIS);
    }
}

alors enregistrer cette fonction dans votre code:

$em->getConfiguration()->addCustomDatetimeFunction('DATE', 'DateFunction');

et votre requête DQL fonctionnera!

31
répondu Benjamin 2013-01-07 01:11:53