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, 出错了也不显示, 一次次请求数据, 最后成功了, 感慨万千啊.

相关推荐
c***72746 小时前
Node.js NativeAddon 构建工具:node-gyp 安装与配置完全指南
node.js
w***74176 小时前
使用Node.js搭配express框架快速构建后端业务接口模块Demo
node.js·express
q***04636 小时前
node.js下载、安装、设置国内镜像源(永久)(Windows11)
node.js
0***h9426 小时前
TypeScript 与后端开发Node.js
javascript·typescript·node.js
ByteCraze7 小时前
面向Nodejs开发人员MCP快速入门
前端·node.js·agent·mcp
诸葛韩信8 小时前
前端工程化1——npm insatall背后的工作原理
前端·npm·node.js
谢尔登10 小时前
Webpack高级之常用配置项
前端·webpack·node.js
y***031710 小时前
如何在Windows系统上安装和配置Node.js及Node版本管理器(nvm)
windows·node.js
l***513913 小时前
2024最新版Node.js下载安装及环境配置教程【保姆级】
node.js
c***871913 小时前
Node.js使用教程
node.js·编辑器·vim