Итак, моя проблема может быть немного сложнее, чем следует из названия - я не знаю, как описать это кратким заголовком.
Предположим, у меня есть две сущности с отношением «многие ко многим» между ними Question
и Category
. В базе данных отношения определены в таблице соединений. Question
- это «сторона-владелец» в этих отношениях - точно так же, как в этом примере: https://typeorm.io/# / many-to-many-Relations / what-are-many-to-many-Relations
Теперь приходит часть, с которой у меня возникают трудности: я всегда хочу вернуть отношения категорий в вопросе, если он есть. Если я делаю это через репозиторий, я могу очень легко сделать это примерно так:
let question = questionRepository.find(id, {relation: ['categories']};
он вернет вопрос с всеми его категориями.
Это становится труднее, когда я хочу сделать это с помощью QueryBuilder. Причина в том, что я пытаюсь составить список вопросов с всеми их категориями на основе массива категорий. Итак, представьте себе следующие данные:
Вопросы:
- ВопросA
- ВопросB
- Вопрос C
Категории:
- Категория1
- Категория2
Отношения:
- ВопросA - Категория1
- ВопросA - Категория2
- ВопросB - Категория1
Опять же, я хочу получить вопросы с всеми их категориями. И я пытаюсь сделать это с помощью QueryBuilder, используя массив CategoryID в предложении where. Это мой текущий конструктор запросов:
let count = categoryIds.length;
let queryBuilder = questionRepository.createQueryBuilder('q')
.leftJoin('q.categories', category)
.where('category.id IN (:categoryIds), {categoryIds})
.groupBy('q.id)
.having(COUNT(DISTINCT category.id) = :count, {count})
.getMany();
Что касается получения всех вопросов, содержащих указанные категории, это работает нормально. Проблема здесь в том, что я хочу вернуть все категории для найденных вопросов.
Итак, представьте, что если categoryIds
будет содержать только Category1
, он вернет и QuestionA
, и QuestionB
. Однако он не вернет все их категории.
Даже если бы я изменил .leftJoin('q.categories', category)
на .leftJoinAndSelect('q.categories', category)
, он вернул бы только Category1
в массиве categories
для обоих вопросов.
Я не смог понять этот, так что любая помощь будет принята с благодарностью! Спасибо.