前言
上一篇,我们介绍了数据库的增删改查这些基础操作,但是需求中,经常会需要我们多个可选条件查询以及分页,那么接下来,我们就需要去了解分页查询以及按条件查询了。
分页
我们先来了解一下分页。从 MidWay 的文档中,我们可以发现,使用 QueryBuilder 可以构建几乎任何复杂的 SQL 查询,那么接下来,我们就简单的了解一下吧。
什么是 QueryBuilder
- QueryBuilder 是 TypeORM 最强大的功能之一 ,它允许你使用优雅便捷的语法构建 SQL 查询,执行并获得自动转换的实体。
- 简单来讲,就是 TypeORM 底层封装了很多方法,可以使用封装好的方法实现一些复杂的 SQL 查询。
创建和使用 QueryBuilder
创建 QueryBuilder
创建 QueryBuilder 有三种方式:使用 connection 、使用 entity manager 、使用 repository ,这里我们采用第二种方式,使用 entity manager 来创建 QueryBuilder 。
之前我们已经创建过 UserEntity ,这里我们还是拿这个来作为例子。使用 createQueryBuilder() 方法,来创建 QueryBuilder 。
1 | // src/service/user.service.ts |
使用 QueryBuilder 获取值
- 从数据库中获取单个结果,使用 getOne()
- 从数据库中获取多个结果,使用 getMany()
- 从数据库中获取多个结果以及数据总数,使用 getManyAndCount()
1 | // src/service/user.service.ts |
我们到这里,已经学会了创建 QueryBuilder 以及使用 QueryBuilder 获取数据库的数据了,那么接下来,我们就来看分页了。
使用分页
在大多数的需求中,我们都会使用分页的功能,这里提供了 take() 和 skip() 方法来辅助我们实现分页的功能
- take(): 返回前多少个数据,这里接收一个 number 类型的参数,表示我们需要拿多少条数据
- skip(): 返回除了前多少个数据以外的数据,同样接收一个 number 类型的参数
我们组合这些方法,就可以实现一个分页的功能,如下:
1 | // src/service/user.service.ts |
按条件查询
分页写完了,但是一般情况下,我们的查询都会携带多个可选的查询条件去进行数据查询,接下来我们就把这些查询条件加进去吧
我们先在 interface.ts 中定义一个接口
1 | // src/interface.ts |
准备工作完成了,就该去使用了,这里我们介绍一个 andWhere() 方法,它的作用就是添加查询条件,具体用法如下:
1 | // src/service/user.service.ts |
模糊查询
模糊查询和按条件查询类似,只不过多了个关键字 LIKE ,并且使用 setParameters 来设置模糊查询的关键字。
1 | // src/service/user.service.ts |
到这里,我们的分页、模糊查询以及按条件查询数据就完成了,但是会发现一个问题, getManyAndCount() 返回的数据总条数是数组的第二个元素,和我们所需要的格式不符,所以我们接下来先把数据格式修改一下。
我们在 constant 里新建一个 pageInfo.ts 文件,然后封装一个 PageInfo 的泛型类,如下:
1 | // src/constant.pageInfo.ts |
这个类我们是在 Service 层去使用的,如下:
1 | // src/service/user.service.ts |
这样,我们在 Controller 层,写一个路由直接调用该查询方法,就可以得到我们想要的数据格式了。
1 |
|
总结
到此,我们的按条件查询以及数据分页就完成了,完成的代码已上传到个人 【GitHub】,有需要可自行下载
关于 QueryBuilder 的 API ,可以从 这里 查看