【发布时间】:2020-10-10 05:09:49
【问题描述】:
所以,我的问题可能比标题所暗示的要复杂一些 - 我不确定如何用简洁的标题来描述。
假设我有两个实体之间存在多对多关系,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
再次,我想获取具有所有类别的问题。我正在尝试通过在 where 子句中使用 CategoryID 数组来使用 QueryBuilder 执行此操作。这是我当前的查询构建器:
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();
就检索包含所提供类别的所有问题而言,这很好用。这里的问题是我想为它找到的问题返回 all 类别。
所以想象一下,如果categoryIds 只包含Category1,它将返回QuestionA 和QuestionB。但是,它不会返回所有他们的类别。
即使我将.leftJoin('q.categories', category) 更改为.leftJoinAndSelect('q.categories', category),它也只会在categories 数组中为这两个问题返回Category1。
我一直无法弄清楚这一点,所以任何帮助将不胜感激!谢谢。
【问题讨论】:
-
另外,我希望找到一个更好的解决方案,但现在仍然使用这种语法:
.leftJoin('relations', 'r', 'q.id = r.questionId', {}).leftJoin(category, 'c', 'c.id = 'r.categoryId,{})
标签: many-to-many query-builder typeorm