如何在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
相关产品推荐
相关产品推荐

