Doctrine DQL-запрос с функциями SQL - PullRequest
5 голосов
/ 03 февраля 2012

Я портирую простое веб-приложение, написанное на 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-запрос из старого приложения в мой новый пакет является обязательным.Пожалуйста, помогите мне найти правильное решение.

Ответы [ 2 ]

11 голосов
/ 14 октября 2015

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

используйте комплект: Расширения Доктрины

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

doctrine:
    orm:
        dql:
            string_functions:
                UNIX_TIMESTAMP: DoctrineExtensions\Query\Mysql\UnixTimestamp
0 голосов
/ 11 июля 2013

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

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

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

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

...