Как использовать "DISTINCT ON (поле)" в Doctrine 2?

Я знаю, как использовать "DISTINCT" в Doctrine 2, но мне действительно нужно использовать "DISTINCT ON (поле)", и я не знаю, как это сделать с QueryBuilder.

Мой SQL-запрос выглядит так:

SELECT DISTINCT ON (currency) currency, amount FROM payments ORDER BY currency

И этот запрос работает идеально, но я не могу использовать его с QueryBuilder. Может быть, я мог бы написать этот запрос по-другому?

Ответ 1

Я бы предположил, что конструкция SELECT DISTINCT ON (..), поддерживаемая PostgreSQL, находится за пределами реляционной модели объекта (ORM), которая является центральной для Doctrine. Или, возможно, по-другому, потому что SELECT DISTINCT ON (..) встречается редко в реализациях SQL. Doctrine не закодирована для него.

Независимо от фактической логики для этого не работает, я предлагаю вам попробовать Doctrine " Native SQL". Вам нужно сопоставить результаты вашего запроса с ORM.

С помощью NativeQuery вы можете выполнить собственные инструкции SELECT SQL и карту результаты для сущностей Doctrine или любого другого формата результата поддерживаются по Доктрине.

Чтобы сделать это сопоставление возможным, вам необходимо описать Учтите, какие столбцы в результирующей карте, к которой относится свойство объекта. Эта описание представлено объектом ResultSetMapping.

С помощью этой функции вы можете сопоставить произвольный код SQL для объектов, таких как оптимизированный с высокой степенью автоматизации SQL или хранимые процедуры.

SELECT DISTINCT ON (..) попадает в оптимизированный для продавцов SQL. Я думаю, поэтому использование NativeQuery должно позволить вам получить к нему доступ.

Ответ 2

У Doctrine QueryBuilder есть некоторые ограничения. Даже если я не проверял, возможно ли это с построителем запросов, я не стесняюсь использовать DQL, когда я не знаю, как написать запрос с построителем запросов.

Ознакомьтесь с примерами в http://doctrine-orm.readthedocs.org/en/latest/reference/dql-doctrine-query-language.html#dql-select-examples

Надеюсь на эту помощь.