这一章关于Query Builder会用的功能做介绍,主要是
- 分页(pagination)
- select部分属性
- 隐藏属性
分页
有三个变量,建立新的queryUserDTO
import { IsString, IsNumber } from 'class-validator';
export class UserQueryDTO{
@IsString()
name: string;
@IsNumber()
page: number;
@IsNumber()
pageSize: number;
}
新增getUsersByRoleName在user.service.ts
async getUsersByRoleName(query: UserQueryDTO){
return await this.userRepo
.createQueryBuilder('u')
.leftJoinAndSelect('u.roles', 'r')
.leftJoinAndSelect('u.plat', 'p')
// 以roleName作为筛选条件
.where('r.roleName like :name', { name: `%${query.name.toLowerCase()}%`})
.orderBy('u.name', 'ASC')
// Orderby也可以串连
.addOrderBy('u.age')
// 跳过数量,第一頁就为0,第二页跳过pageSize
.skip((query.page - 1) * query.pageSize)
.take(query.pageSize) // 取pageSize筆數
.getManyAndCount(); // 回传record 并 count数量
}
使用Postman测试
2018111407.png
select部分属性
有时候不想expose所有属性,可以用select来筛选,当然也有object mapping的套件把部分属性mapping到新的class上,但先就选择部分属性为例,假设只想要name, 及roleName,其他如plat则不需要
async getUsersByRoleName(query: UserQueryDTO){
return await this.userRepo
.createQueryBuilder('u')
.leftJoinAndSelect('u.roles', 'r')
.leftJoinAndSelect('u.plat', 'p')
// 以roleName作为筛选条件
.where('r.roleName like :name', { name: `%${query.name.toLowerCase()}%`})
.orderBy('u.name', 'ASC')
// Orderby也可以串连
.addOrderBy('u.age')
// 跳过数量,第一页就为0,第二页跳过pageSize
.skip((query.page - 1) * query.pageSize)
.take(query.pageSize) // 取pageSize
.select([ // 第一直觉只要列举要的属性
'u.age',
'u.name',
'r.id',
'r.roleName',
])
.getManyAndCount(); // 回传record 并 count数量
}
使用postman测试
2018111408.png
原因是沒有SELECT u.id,这里TypeORM并不会自动产生,但沒有,所以要自己加,或是直接select alias
在select加上u.id
.select([
'u.id',
'u.age',
'u.name',
'r.id',
'r.roleName',
])
使用postman测试
2018111409.png
隐藏属性
如果有一个属性在大多数时候都不希望被select到,只有少数情况会用到,typeorm提供隐藏属性的概念,在QueryBuilder中select entity或是Repository find预设不会被选到,则需要在属性上设定,如User Entity的password属性
在user.entity下新增password属性
@Column({
nullable: true, // 因为此属性后来才加,不设置nullable无法新增此属性
length: 100,
// 一般用repository.find不会出现此属性
// 在QueryBuilder中select entity也不会出现
select: false,
})
password: string;
用postman测试,会发现所有返回的用户都没有带password属性
那如何在query的时候让password出现呢
修改query, 新增addSelect让password出现
.addSelect('u.password')
使用postman测试
2018111410.png
密码属性出现
推荐一下我的公众号: 【 geekjc 】,微信号: 【 c8706288 】一起学习交流编程知识,分享经验,各种有趣的事。
tuiguang.png