如何将sort参数动态传入order配置实现查询结果动态排序
自定义排序字段功能实现方案
核心问题
你之前的写法order: { sort: order }是将sort作为固定的排序字段名,并不会读取你提前声明的sort变量的值作为动态字段,因此无法实现自定义排序字段的效果。
实现方案
使用ES6计算属性语法实现动态字段绑定,同时增加字段合法性校验,避免非法参数引发报错或安全问题:
const search = query.search || ''; // 校验排序方向合法性,非法值默认用ASC const order = query.order?.toUpperCase() === 'DESC' ? 'DESC' : 'ASC'; const sort = query.sort || 'id'; // 配置默认排序字段,避免空值 // 配置允许排序的字段白名单,根据你的实际业务字段调整即可 const ALLOW_SORT_FIELDS = ['id', 'username', 'email', 'createTime']; const finalSort = ALLOW_SORT_FIELDS.includes(sort) ? sort : 'id'; const [data, total] = await this.userRepository.findAndCount({ relations: ['role'], where: [{ username: ILike(`%${search}%`), email: ILike(`%${search}%`) }], // 用计算属性名动态指定排序字段 order: { [finalSort]: order }, take, skip: (page - 1) * take });
扩展说明
如果需要支持关联表字段排序(比如按role表的name字段排序),只需要调整order的写法为嵌套结构即可,示例:
order: { role: { [finalSort]: order } }
同时把关联表的对应字段加到白名单里即可正常使用。
内容的提问来源于stack exchange,提问作者user16127241
相关产品推荐
相关产品推荐

