Функция Doctrine 2 DATE_ADD mysql с вычисленным значением интервала

У меня есть запрос, который дает мне временную метку unix, рассчитанную путем выбора значения даты и времени поля таблицы, а затем добавления другого значения таблицы. Запрос примерно следующий:

SELECT UNIX_TIMESTAMP(DATE_ADD(mydatetimefield, INTERVAL m.myfield1 + m.myfield2 MINUTE)) FROM mytable AS m

этот запрос правильно выполняется из phpMyAdmin, но когда я пытаюсь использовать его с методом createQueryBuilder из Doctrine 2, я получаю сообщение об ошибке в «myfield». Кажется, он не поддерживает вычисляемое значение после ключевого слова INTERVAL.

Error: Expected Doctrine\ORM\Query\Lexer::T_COMMA, got 'm'

как я могу получить тот же результат запроса, используя доктрину? Я использую конструктор запросов, потому что у меня есть некоторые именованные параметры.


person Stefano    schedule 21.11.2012    source источник
comment
Вы также должны предоставить код, используемый с createQueryBuilder.   -  person dan    schedule 22.11.2012
comment
Вы также упростили запрос в своем примере?   -  person kmfk    schedule 22.11.2012
comment
Как использовать DATE_ADD OR DATE_SUB с интервалом в часах. См. этот ответ: stackoverflow.com/a/22223127/879708   -  person Francis    schedule 06.03.2014


Ответы (2)


По умолчанию Doctrine не поддерживает все функции конкретного поставщика, такие как DATE_ADD. Однако вы можете использовать определенные пользователем функции. В этой ссылке есть пример специально для добавления даты.

Расширение DQL в Doctrine 2: Пользовательские функции

Другой вариант, в зависимости от сложности запроса, — просто обработать его в коде приложения. если ваш mydatetimefield на самом деле является датой и временем, Doctrine преобразует его в php DateTime в возвращаемом объекте.

$myDateTimeField = $object->getMyDateTimeField();
$myDateTimeField->add(new DateInterval( $object->getMyField1() + $object->getMyField2() . 'M'));

Наконец, вы всегда можете использовать dbal.

person kmfk    schedule 21.11.2012
comment
Я получаю сообщение об ошибке, когда пытаюсь использовать эту функцию DateAdd: Не разрешено перезаписывать внутреннюю функцию date_add в синтаксическом анализаторе DQL с помощью пользовательских функций. Почему? - person Stefano; 22.11.2012
comment
Похоже, они добавили DATE_ADD — хотя, судя по документации, реализация Doctrine поддерживает только добавление интервалов day и monthФункции DQL — если вы хотите создать свои собственные разрешенные минуты, вам нужно будет использовать другое имя для функция. - person kmfk; 26.11.2012
comment
Мне очень плохо, что мы не можем переопределить функции по умолчанию, однако я решил использовать необработанный SQL-запрос вместо DQL. - person Stefano; 26.11.2012

Не уверен, что это причина, но поскольку он жалуется на отсутствующую запятую, где у вас есть псевдоним m, я подозреваю, что он не может правильно анализировать пользовательские функции.

Вы определили DATE_ADD и UNIX_TIMESTAMP как Определяемые пользователем функции DQL? См. раздел Дата добавления. пример для более подробной информации.

person dan    schedule 21.11.2012
comment
удаление пользовательской функции UNIX_TIMESTAMP не решает проблему - person Stefano; 22.11.2012
comment
@Stefano И вы определили DATE_ADD как пользовательскую функцию? - person dan; 22.11.2012
comment
нет, не знаю. Я пытался использовать функцию DATE_ADD, как в MySQL, но потом увидел, что Doctrine 2 не поддерживает INTERVAL, а также не имеет полной поддержки всех типов (часов, минут и т. д.). Я буду использовать функцию, о которой сообщил kmfk - person Stefano; 22.11.2012
comment
@Stefano Это ваш выбор, но вы также можете использовать DATE_ADD, см. примерную ссылку, которую я предоставил в своем ответе. - person dan; 22.11.2012
comment
код функции DateAdd, которую вы опубликовали, такой же, как я нашел на github через kmfk. Автор функции и статьи один и тот же - person Stefano; 22.11.2012