1 Отредактировано nepster (2017-12-24 19:04:07)

Тема: Оптимизация доктрины и поиск по реляциям (many to many)

Задача достаточно простая: организовать статьи с тэгами, типом и картинками.
Таблицы будут выглядеть следующим образом:

content_records - Все записи
content_types - типы (не особо нам интеерсно)
content_records_images - изображения
content_tags - тэги
content_record_tags_relation - связи тэг-статья

Теперь нам необходимо получить список из скажем 4 статей с типом, со всеми тегами, картинками и тп.

В моей ситуации я не хочу полагаться на ленивую загрузку, так-как, я за ранее знаю, что мне нужно вернуть.
В моем случае все + произвести поиск по ассоциациям. Например поиск статей по определенному тегу и типу.

Проблема с которой я столкнулся следующая:
Я делаю запрос с join, доктрина в свою очередь делает примерно вот такой sql запрос:

SELECT
  c0_.id AS id_0,
  c0_.alias AS alias_1,
  c0_.tips_and_inspiration AS tips_and_inspiration_2,
  c0_.is_visible AS is_visible_3,
  c0_.translations AS translations_4,
  c0_.created_at AS created_at_5,
  c0_.updated_at AS updated_at_6,
  c1_.id AS id_7,
  c1_.alias AS alias_8,
  c1_.translations AS translations_9,
  c1_.created_at AS created_at_10,
  c1_.updated_at AS updated_at_11,
  c2_.id AS id_12,
  c2_.alias AS alias_13,
  c2_.type AS type_14,
  c2_.translations AS translations_15,
  c2_.created_at AS created_at_16,
  c2_.updated_at AS updated_at_17,
  c0_.type_id AS type_id_18
FROM content_records c0_
  LEFT JOIN content_types c1_ ON c0_.type_id = c1_.id
  LEFT JOIN content_record_tags_relation c3_ ON c0_.id = c3_.record_id
  LEFT JOIN content_tags c2_ ON c2_.id = c3_.tag_id
WHERE c1_.alias = 'journal'
LIMIT 4
OFFSET 0

Теперь предположим, что в статье 1 указано 4 тэга. Тогда результат будет примерно такой:
http://i.imgur.com/Lq345y5.png

На выходе:

$records = $qb->getQuery()->getResult();

будет 1 статья, так-как доктрина посчитает 3 одинаковые записи идентичными объектами. А из-за limit, до других записей не дойдем.


DISTINCT - не работает, ну и понятно почему, так-как доктрина должна получить данные о тегах.
Подскажите, пожалуйста, как можно оптимизировать такой запрос, чтобы он правильно отдавал результат?