У меня есть 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 к этой ситуации?
AssociatedTag
, чтобы можно было учесть совокупные характеристики. - person dnagirl   schedule 31.08.2013