这一章关于 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
来源: http://www.jianshu.com/p/bc41d77850e9