You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在TypeORM中查询一对多关联的ID数组?

如何获取关联表的ID数组而非对象数组

方法1:利用数据库聚合函数直接生成ID数组(推荐)

如果你的数据库支持聚合函数(比如PostgreSQL、MySQL 8.0+),可以直接在查询构造器中生成ID数组,无需后续处理:

PostgreSQL 版本

const category = await this.repository
  .createQueryBuilder('category')
  .select(['category.id', 'category.name'])
  .addSelect('array_agg(posts.id)', 'postIds')
  .leftJoin('category.posts', 'posts')
  .where('category.id = :id', { id })
  .groupBy('category.id, category.name')
  .getOne();

MySQL 版本

const category = await this.repository
  .createQueryBuilder('category')
  .select(['category.id', 'category.name'])
  .addSelect('JSON_ARRAYAGG(posts.id)', 'postIds')
  .leftJoin('category.posts', 'posts')
  .where('category.id = :id', { id })
  .groupBy('category.id, category.name')
  .getOne();

查询返回结果直接符合需求:

Category {
  id: 1,
  name: 'category name',
  postIds: [1, 2, 3],
}

方法2:查询后手动转换结果

如果不想依赖数据库特性,也可以在获取查询结果后,手动处理数组:

const category = await this.repository
  .createQueryBuilder('category')
  .select(['category.id', 'category.name'])
  .leftJoin('category.posts', 'posts')
  .addSelect(['posts.id'])
  .where('category.id = :id', { id })
  .getOne();

if (category) {
  // 将posts对象数组转为ID数组
  category.postIds = category.posts.map(post => post.id);
  // 可选:删除原posts字段
  delete category.posts;
}

这样处理后同样能得到你需要的结构。

内容的提问来源于stack exchange,提问作者Sambath Srey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 15:18:14