У меня следующий запрос
SELECT news.*, count(*) AS common_tags
FROM news
JOIN news_news_tag ON news.id = news_news_tag.news_id
WHERE news_tag_id IN
(SELECT news_tag_id FROM news_news_tag WHERE news_id = 2 )
AND news.id != 2 GROUP BY news.id ORDER BY common_tags DESC
Чего я хочу добиться, так это получить гидратированные объекты новостей, упорядоченные по количеству общих тегов с предоставленным идентификатором новостей. News
и Tag
имеют отношение многие ко многим с news_news_tag
таблицей соединений.
News
сущность получила гораздо больше других отношений. Вот почему я не хочу создавать собственный запрос для обработки всех других отношений. Я хотел бы преобразовать вышеупомянутый запрос, чтобы использовать его с построителем запросов. Я не смог использовать DQL, потому что мой оператор where
использует таблицу соединения (соединения), и мне также нужно использовать join
для этой таблицы.
Всего у меня 2 проблемы :
Как я могу создать подзапрос DQL, чтобы выбрать что-то из множества таблиц присоединения ко многим)? Если я знаю, что могу сделать что-то вроде: ->where($queryBuilder->expr()->in('u.id', $mySubQueryAsDQL))
Как добавить это join
утверждение, которое я мог бы использовать news_tag_id
в where
утверждении?
Если это невозможно, я думаю, что мне нужно было бы создать два двунаправленных отношения «один ко многим» и «многие к одному» вместо «многие ко многим» и работать над специальной объединяющей сущностью.