Подход Symfony к отображению агрегированных данных сущностей

У меня есть 3 объекта Expertise, Person and Tag,, связанных через объект соединения, AssociatedTag который имеет составной первичный ключ (expertise_id, tag_id, person_id). Это работает правильно.

Поскольку несколько человек могут добавить один и тот же тег к определенному опыту, простое отображение каждой строки тега может привести к дублированию. Если бы я не работал в Symfony, я бы просто выполнил агрегированный запрос, подобный этому:

SELECT 
    t.tag, a.tag_id
    a.expertise_id,
    COUNT(a.person_id) AS tagcount,
    SUM(CASE
        WHEN a.person_id = ? THEN 1
        ELSE 0
    END) AS has_curuser
FROM
    expertise_tags a
        JOIN
    tag t ON (a.tag_id = t.id)
WHERE
    a.expertise_id = ?   #397
GROUP BY t.tag , a.expertise_id;

который будет производить такие данные:

foobe   9   397 1   0
neato   7   397 2   1
pita    8   397 1   0

а затем выводить с помощью простого цикла и условий, таких как has_curuser == TRUE и tagcount > 1, для управления параметрами вывода.

С Symfony у меня сложилось впечатление, что должен быть класс для хранения агрегированных результатов или, возможно, должен быть преобразователь данных или расширение Twig, которое принимает неагрегированные результаты и агрегирует их (хотя это кажется неэффективным).

Каков правильный подход Symfony к этой ситуации?


person dnagirl    schedule 30.08.2013    source источник
comment
Немного не понял вопроса, задача выполнить запрос или вывести результат?   -  person Alexey B.    schedule 31.08.2013
comment
@forgottenbas: Если правильно сделать запрос, куда он должен идти (возможно, контроллер?) и как это сделать; если не корректно сделать запрос, то как вывести коллекцию AssociatedTag, чтобы можно было учесть совокупные характеристики.   -  person dnagirl    schedule 31.08.2013
comment
Одним из возможных решений является использование собственных запросов. Я описываю это в своем ответе. Да, вы можете запустить запрос в контроллере, в репозитории сущностей или из пользовательской службы.   -  person Alexey B.    schedule 31.08.2013


Ответы (1)


В связи с тем, что доктрина DQL поддерживает ограниченную часть функциональности родного языка SQL для сложных запросов, вы можете использовать собственные запросы.

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

person Alexey B.    schedule 31.08.2013