【问题标题】:TypeORM many to many retrieve all relationsTypeORM 多对多检索所有关系
【发布时间】:2020-10-10 05:09:49
【问题描述】:

所以,我的问题可能比标题所暗示的要复杂一些 - 我不确定如何用简洁的标题来描述。

假设我有两个实体之间存在多对多关系,QuestionCategory。在数据库中,关系是在连接表中定义的。 Question 是这种关系中的“拥有方”——就像在这个例子中一样:https://typeorm.io/#/many-to-many-relations/what-are-many-to-many-relations

现在是我遇到困难的部分:我总是想返回问题的类别关系,以防万一。如果我通过存储库来做,我可以很容易地用这样的东西来做:

let question = questionRepository.find(id, {relation: ['categories']};

它会返回带有所有个类别的问题。

当我想使用 QueryBuilder 时,这会变得更加困难。原因是,我正在尝试根据一系列类别列出问题及其类别的所有。所以想象一下以下数据:

问题:

  1. 问题A
  2. 问题B
  3. 问题C

分类:

  1. 类别1
  2. 类别2

关系:

  1. 问题 A - 类别 1
  2. 问题 A - 类别 2
  3. 问题 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,它将返回QuestionAQuestionB。但是,它不会返回所有他们的类别。

即使我将.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


【解决方案1】:

这完全取决于您想要实现的目标。 TypeORM 为您提供了许多选择。有时在实体定义中使用装饰器就足够了。

let results = questionRepository.createQueryBuilder('q')
    .leftJoin('q.categories', 'cat', 'cat.id IN(:...categoryIds)', {categoryIds})
    .getMany();

在其他情况下,您必须手动构造ON 子句。

let results = questionRepository.createQueryBuilder('q')
    .innerJoin('relations', 'r', 'q.id = r.queryId')
    .innerJoinAndMapMany('q.categories', 'categories', 'c', 
        'c.id = r.categoryId AND c.id IN(:...categoryIds)', {categoryIds})
    .getMany();
   

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-29
    • 2021-08-29
    • 2022-10-07
    • 2020-09-01
    • 2020-12-03
    • 2020-09-27
    • 2021-12-26
    • 2018-05-23
    相关资源
    最近更新 更多