在DQL WHERE子句使用日期()函数(Use a DATE() function in a WH

2019-06-19 00:43发布

我得到一个奇怪的错误,当我执行此DQL查询:

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

唯一的例外是抛出学说与消息:

Expected known function, got 'DATE'

这个问题类似于此的错误 ,但解决了date()函数在GROUP BY子句和错误被关闭学说2.2。 在这个时刻,我与学说2.4-DEV例外。

查询是为了选择原定于今天的所有用户。 有没有什么办法可以创建此DQL? 我在phpMyAdmin测试的SQL版本有查询没有引发错误。 可能是什么问题?

Answer 1:

你可以实现你用想要的自定义函数 :

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的查询将工作!



文章来源: Use a DATE() function in a WHERE clause with DQL