【问题标题】:Fetching TypeORM data with limit and order by and child relationship with getMany()使用 gerMany() 获取具有 limit 和 order by 以及子关系的 TypeORM 数据
【发布时间】:2021-07-14 12:38:37
【问题描述】:

我需要 nestjs typeorm 查询方面的帮助。场景如下 假设我有 3 张桌子,分别是教师、学生和家长

  1. 教师 = 与学生的一对多关系,即一名教师可以 教多名学生。
  2. 学生 = 多对一关系 w.r.t 教师。
  3. 学生 = 一对多 w.r.t 父母,假设有 1 个孩子 父母的
  4. 父母 = 与学生多对一
    const records = await this.createQueryBuilder('teachers').leftJoinAndSelect('teachers.students', 'students').leftJoinAndSelect('students.parents', 'parents').orderBy('teachers.id', 'DESC').limit(1);
    let res = await records.getMany();

输出类似的东西

{
  teacher_id: '4',
  teacher_name: 'abc',
  students: [
    {
      'id': 1,
      'name': 'pqr',
      status: 'failed',
      parents: [
        {
          id: 1,
          name: 'mom',
          relationship: 'mom'
        },
        {
          id: 2,
          name: 'dad',
          relationship: 'dad'
        }
      ]
    }
  ]
}

【问题讨论】:

    标签: mysql node.js typescript nestjs typeorm


    【解决方案1】:

    假设有 100 位教师。每个老师有 20 个学生,每个学生有 2 个家长。

    查询将返回的总记录 = 100 * 20 * 2 = 4000

    但在以分页方式显示结果时,我们需要按teacher.id 对记录进行分组。

    使用 group by teacher.id 的总数 = 100

    示例代码-

      async getTeacher(): Promise<any[]> {
          return await this.repo
          .createQueryBuilder('teachers')
          .leftJoinAndSelect('teachers.students', 'students')
          .leftJoinAndSelect('students.parents', 'parents')
          .groupBy('teachers.id')
          .orderBy('teachers.id','DESC')
          .limit(1)
          .getMany();
      }
    

    【讨论】:

    • 感谢您的回答,但我不是在寻找分页,我只是在寻找 1 个特定记录(限制 1),我几乎没有像老师姓名和学生这样的条件失败,所以 1 1 我需要展示。
    • @KhushalChheda,很高兴为您提供帮助!我已根据您的要求更新了代码。谢谢!
    • 如果您要检查它,它会给出 1 parent 作为输出,而不是 2 。如果您要检查的话,我已经写过类似的查询
    • @KhushalChheda,我要求使用 getRawMany 而不是 getMany 并检查您是否获得了父母的多条记录
    猜你喜欢
    • 2020-05-01
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 2012-02-27
    • 2011-09-06
    相关资源
    最近更新 更多