Запрос Doctrine DQL с функциями SQL

Я портирую простое веб-приложение, написанное на CodeIgniter, на пакет Symfony2. Я новичок в Symfony2 и Doctrine, и у меня проблема с одним SQL-запросом, который я хочу переписать на DQL. Я все готов к работе в своем пакете, я создал класс Entity, и я могу вставлять данные в базу данных и выполнять простые запросы в способе объектно-ориентированного программирования, который предоставляет Symfony2. К сожалению, я понятия не имею, как реализовать этот SQL-запрос в DQL:

$sql = "SELECT * FROM t WHERE 
UNIX_TIMESTAMP(t.date) > ".(time()-300)." AND
ROUND(t.x,3) = ".round($x, 3);

Как видите, есть вызовы некоторых функций SQL, которые необходимо выполнить на сервере базы данных. Доктрина не может понять эти призывы. Конечно, у меня есть возможность выйти из использования Doctrine и выполнить этот запрос, используя базовый PDO внутри моего пакета Symfony2, но я хотел бы воспользоваться всеми преимуществами использования Symfony2 и Doctrine. Поэтому я хотел бы, чтобы это было сделано в ООП или с помощью умного запроса DQL, который понимает что-то вроде:

$em->createQuery("SELECT t FROM MyTestBundle:MyEntity t WHERE t.x = :x")
->setParameter("x", round($x,3));

но возможность переписать мой SQL-запрос из старого приложения в новый пакет - необходимость. Пожалуйста, помогите мне найти правильное решение.


person Darrarski    schedule 03.02.2012    source источник


Ответы (2)


Я знаю, что встречаюсь немного позже, но если это позволяет другому найти альтернативное решение:

использовать пакет: Doctrine Extensions

после настройки config.yml:

doctrine:
    orm:
        dql:
            string_functions:
                UNIX_TIMESTAMP: DoctrineExtensions\Query\Mysql\UnixTimestamp
person Snoozer    schedule 14.10.2015

К сожалению, вы не можете использовать функции SQL в запросе DQL. Итак, у вас есть 2 варианта:

  1. Вы можете создать пользовательскую функцию в DQL. Вот официальная документация Doctrine о том, как это сделать http://docs.doctrine-project.org/en/latest/cookbook/dql-user-defined-functions.html

  2. Или вы можете выполнить SQL-запрос прямо в доктрине. Вот официальная документация по использованию Native SQL в Doctrine http://docs.doctrine-project.org/en/latest/reference/native-sql.html.

Судя по дате в вопросе, я не думаю, что это поможет вам сейчас, но я надеюсь, что это поможет другим, у которых есть такая же проблема.

person Calin    schedule 11.07.2013