14

执行此 DQL 查询时出现一个奇怪的错误:

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

Doctrine 抛出异常并显示以下消息:

Expected known function, got 'DATE'

这个问题看起来与这个 bug相似,但它解决了 GROUP BY 子句中的 DATE() 函数,并且该 bug 已在 Doctrine 2.2 中关闭。此刻,我得到了学说 2.4-DEV 的异常。

该查询旨在选择今天安排的所有用户。有什么方法可以创建这个 DQL?我在 phpMyAdmin 中测试了 SQL 版本,查询没有引发错误。可能有什么问题?

4

1 回答 1

31

您可以使用自定义函数来实现您想要的:

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);
    }
}

然后在你的代码中注册这个函数:

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

您的 DQL 查询将起作用!

于 2013-01-07T01:06:12.043 回答