Проще говоря, Doctrine ORM не предназначен для преобразования запросов SQL обратно в DQL.DQL - это язык запросов, который может быть переведен в несколько вариантов SQL для конкретного поставщика, поэтому это одностороннее преобразование из DQL в SQL.
Таким образом, если у вас есть только запрос SQL, это может бытьхорошая идея использовать именно это, используя Doctrine DBAL .Конечно, вам, вероятно, придется иметь дело с отображениями наборов результатов, но может не потребоваться перетаскивать все содержимое ORM в ваш код.
То, что вы здесь делаете, - это, по сути, создание DQL-запроса с использованиемДоктрина QueryBuilder
API.Часть FROM
абсолютно верна, но те, которые используют функции DATE_FORMAT
и DATE
, выглядят неправильно для меня.Поскольку DQL переводится в несколько различных реализаций SQL, в зависимости от используемого вами драйвера, ему необходим уровень совместимости, поскольку такие функции, как DATE_FORMAT
, DATE
и CURDATE
, не являются общими для всех платформ.
Сначала взгляните на документацию для пользовательских функций .Например, функция DATEDIFF()
в MySQL является хорошим примером.Если окажется, что никто еще не реализовал поддержку функций, которые вы используете, это хорошее место для начала, так как он в основном описывает, как реализовать расширение для языка запросов Doctrine (DQL).
Во-вторых, есть хороший шанс, что используемые вами функции уже реализованы в некоторых сторонних библиотеках, таких как OroCRM или Расширения Doctrine Бенджамина Эберлей.
Кроме того, если вы выбираете агрегацию или результат вызова функции, всегда полезно псевдоним.Здесь вы можете попробовать использовать подмножество функций $qb->expr()
, чтобы ограничить DQL более строгой грамматикой.