如何在TypeORM中合并结构不同的两张表并实现分页等操作?
合并不同结构表并实现分页、排序、筛选的解决方案
可以通过UNION ALL将两张表的查询结果合并为统一结构的数据集,再基于这个合并后的数据集完成分页、排序和筛选操作。核心思路是先将两张表的查询结果映射为相同的字段结构(用别名统一字段名),再对合并后的结果集进行后续操作。
实现步骤与代码示例
- 分别为两张表构建子查询,将不同字段映射为统一的输出字段(比如用
type字段区分是内容还是文件夹) - 通过
UNION ALL合并两个子查询 - 对合并后的结果集执行排序、分页和筛选
// 构建合并后的查询 const combinedResult = await this.connection.createQueryBuilder() // 第一个子查询:查询contents表,统一字段别名 .select('content.id', 'id') .addSelect('content.title', 'name') .addSelect('"content"', 'type') // 标记类型为content .from(Content, 'content') // 合并folders表的查询 .unionAll(qb => qb .select('folder.id', 'id') .addSelect('folder.name', 'name') .addSelect('"folder"', 'type') // 标记类型为folder .from(Folder, 'folder') ) // 全局排序(基于统一后的字段) .orderBy('id', 'ASC') // 筛选条件示例(按需添加,比如按类型筛选) // .where('type = :type', { type: 'content' }) // 分页 .skip(skip) .take(count) .getRawMany(); // 获取统一结构的原始数据 // 按需拆分结果为对应实体类型 const contents = combinedResult.filter(item => item.type === 'content') as unknown as Content[]; const folders = combinedResult.filter(item => item.type === 'folder') as unknown as Folder[];
注意事项
- 必须保证
UNION ALL前后两个子查询的输出字段数量、类型一致,否则会报错。如果两张表字段差异大,可用NULL填充缺失字段(比如select('NULL', 'description')) - 针对原表特有字段的筛选条件,需要在对应的子查询中添加
WHERE,而非合并后的全局查询 - 排序字段必须是合并结果集中存在的统一别名字段
内容的提问来源于stack exchange,提问作者annn
相关产品推荐
相关产品推荐

