如何使用TypeORM查询带关联关系且关联数据已排序的结果?
关联从属数据排序实现方案
你当前使用TypeORM的eager加载仅主表排序生效于关联数据,可通过以下两种方案实现需求:
方案1:直接修改find方法配置
在现有find配置的order字段内,用关联属性名.关联表字段格式声明关联排序规则即可,示例代码如下:
// 注意:示例中subordinates为示例关联属性名,请替换为你UserEntity内实际定义的关联属性名,排序字段也同步替换为从属表实际字段 getUserWithId(params: string): Observable<userEntity[]> { return from(this.userRepository.find({ where: { id: params }, // 若你已在实体装饰器中已配置eager: true可省略本行 relations: ['subordinates'], order:{ // 保留原有主表排序规则 id:'DESC', // 新增关联从属数据排序规则,按从属表createTime字段倒序排列 'subordinates.createTime': 'DESC' } })) }
方案2:使用QueryBuilder实现(适合复杂多关联场景)
如果需要处理多层嵌套关联、多维度排序等复杂场景,推荐使用QueryBuilder写法更灵活:
getUserWithId(params: string): Observable<userEntity[]> { return from(this.userRepository .createQueryBuilder('user') // 关联加载从属数据,sub为从属表查询别名 .leftJoinAndSelect('user.subordinates', 'sub') .where('user.id = :id', { id: params }) // 主表排序 .orderBy('user.id', 'DESC') // 关联从属表排序 .addOrderBy('sub.createTime', 'DESC') .getMany() ) }
注意事项
- 若为多层嵌套关联时,排序规则写法为
上层关联属性名.下层关联属性名.排序字段即可生效 - 现有代码中
pramas、getUerWithId为拼写错误,建议修正为params、getUserWithId避免后续问题
内容的提问来源于stack exchange,提问作者firas debich
相关产品推荐
相关产品推荐

