14

このDQLクエリを実行すると、奇妙なエラーが発生します。

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

例外は、Doctrineによって次のメッセージとともにスローされます。

Expected known function, got 'DATE'

問題はこのバグに似ていますが、GROUP BY句のDATE()関数に対処しており、Doctrine2.2ではバグは閉じられています。現時点では、Doctrine2.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 に答える