Nestjs typeorm 一对多关系, 取多的一方的最新一条记录进行排序

我们常常有这样的要求, 一篇文章, 里面有一个一对多的关联关系记录. 如果我们要在一个列表里, 对多篇文章, 以最新的一条记录做排序.

打个例子, 一项目, 多人同时开发, 每次推送, 都添加一条信息. 要做列表展示时, 只显示每个人的最近一条记录.

js 复制代码
// 项目
@Entity("project")
export class Project {
    @Column()
    id: number;
    
    @CreateDateColumn({ comment: "创建时间", name: 'create_at', nullable: true })
    createAt?: Date
    
    // 一对多的关系
    @OneToMany(() => Process, process => process.component)
    processes: Process[];
    
    // 最新的一条进展, 映射使用
    newestProcess?: Process;
}

// 添加进展记录
@Entity("process")
export class Process {
    @Column()
    id: number;
    
    @CreateDateColumn({ comment: "创建时间", name: 'create_at', nullable: true })
    createAt?: Date
    
    // 多对一的关系
    @ManyToOne(() => Project, project => project.processes)
    @JoinColumn({name : "project_id"})
    project: Project;
    
}

一般操作, 不以 processes 做排序的情况可做.

上面二个表, 直接关联查找出所以有的数据, processes 数组查出来后, 在计算最新一条, 通过模型转换成需要的列表.

js 复制代码
const result = await this.componentRepo.createQueryBuilder('project')
        .leftJoinAndSelect('project.processes', 'processes')
        .getMany()

得到 result 后, 我们在对 processes 去排序, 取得最新一条. 但是, 这里有个问题, 不能用 process 的 createAt 去排序, 数据会不准

优秀操作, 可以对 processes 里面字段做排序

同样的操作, 多了一步映射一条数据. 把 processes 最新的一条映射到外面 Project 去

在实体表 Project 添加上

js 复制代码
// 最新的一条进展, 映射使用
newestProcess?: Process;

然后,

js 复制代码
const result = await this.componentRepo.createQueryBuilder('project')
        .leftJoin('project.processes', 'processes') // 不需要全部数据, 可以用 leftJoin
        .leftJoinAndMapOne('project.newestProcess', Process, 'newestProcess', 'newestProcess.create_at = (SELECT MAX(p.create_at) FROM processes p WHERE p.projectt_id = project.id)') // 映射最新一条进展
        .orderBy("newestProcess.createAt", "DESC") // 这里排序
        .getMany()

上面 leftJoinAndMapOne 条件的原理是, 查到 processes 里面 create_at 时间是最大的一条记录, 然后给到 newestProcess.create_at.

PS: 就这一条映射, typeorm 官方文档真没有啊, 翻了几遍内外网, 都没有找到方法, 我一开始是第一种方法来做的, 后面发现排序有问题, 一直找解决方法都没有找到, 最后查看源码, 发现 leftJoinAndMapOne 可以上 sql 原始语法, 后面 sql 的原始语法来做了. 尝试了不知道多少次了, 一次次改 sql, 出错了也不显示, 一次次请求数据, 最后成功了, 感慨万千啊.

相关推荐
风止何安啊2 小时前
JS 对象:从 “散装” 到 “精装” 的晋级之路
前端·javascript·node.js
y***03172 小时前
Node.js npm 安装过程中 EBUSY 错误的分析与解决方案
前端·npm·node.js
j***48544 小时前
Node.js实现WebSocket教程
websocket·网络协议·node.js
r***99824 小时前
Node.js使用教程
node.js·编辑器·vim
前端摸鱼匠6 小时前
Vue 3 的全局组件注册:讲解如何全局注册组件
前端·javascript·vue.js·前端框架·node.js·ecmascript
r***11337 小时前
从零开始在Windows系统上搭建一个node.js后端服务项目
windows·node.js
a***81398 小时前
Node.js 与 Docker 深度整合:轻松部署与管理 Node.js 应用
docker·容器·node.js
U***e6318 小时前
前端构建工具迁移,Webpack到Vite
前端·webpack·node.js
百***35511 天前
TypeScript 与后端开发Node.js
javascript·typescript·node.js
q***46521 天前
最新最详细的配置Node.js环境教程
node.js