Подтвердить что ты не робот

Используйте функцию DATE() в предложении WHERE с DQL

Я получаю странную ошибку при выполнении этого DQL-запроса:

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

Исключение вызывается Doctrine с сообщением:

Expected known function, got 'DATE'

Проблема похожа на эту ошибку, но это касается функции DATE() в предложении GROUP BY, и ошибка закрыта для Doctrine 2.2. В этот момент я получаю исключение из доктрины 2.4-DEV.

Запрос предназначен для выбора всех пользователей, запланированных на сегодняшний день. Есть ли способ создать этот DQL? Я протестировал SQL-версию в phpMyAdmin, и там запрос не вызывает ошибку. Что может быть неправильным?

4b9b3361

Ответ 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-запрос будет работать!