這一章關(guān)于Query Builder會(huì)用的功能做介紹褪那,主要是
- 分頁(yè)(pagination)
- select部分屬性
- 隱藏屬性
分頁(yè)
有三個(gè)變量,建立新的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')
// 跳過(guò)數(shù)量师坎,第一頁(yè)就為0,第二頁(yè)跳過(guò)pageSize
.skip((query.page - 1) * query.pageSize)
.take(query.pageSize) // 取pageSize筆數(shù)
.getManyAndCount(); // 回傳record 并 count數(shù)量
}
使用Postman測(cè)試
select部分屬性
有時(shí)候不想expose所有屬性堪滨,可以用select來(lái)篩選胯陋,當(dāng)然也有object mapping的套件把部分屬性mapping到新的class上,但先就選擇部分屬性為例袱箱,假設(shè)只想要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')
// 跳過(guò)數(shù)量,第一頁(yè)就為0发笔,第二頁(yè)跳過(guò)pageSize
.skip((query.page - 1) * query.pageSize)
.take(query.pageSize) // 取pageSize
.select([ // 第一直覺(jué)只要列舉要的屬性
'u.age',
'u.name',
'r.id',
'r.roleName',
])
.getManyAndCount(); // 回傳record 并 count數(shù)量
}
使用postman測(cè)試
原因是沒(méi)有SELECT u.id盟萨,這里TypeORM并不會(huì)自動(dòng)產(chǎn)生,但沒(méi)有了讨,所以要自己加捻激,或是直接select alias
在select加上u.id
.select([
'u.id',
'u.age',
'u.name',
'r.id',
'r.roleName',
])
使用postman測(cè)試
隱藏屬性
如果有一個(gè)屬性在大多數(shù)時(shí)候都不希望被select到,只有少數(shù)情況會(huì)用到前计,typeorm提供隱藏屬性的概念胞谭,在QueryBuilder中select entity或是Repository find預(yù)設(shè)不會(huì)被選到,則需要在屬性上設(shè)定男杈,如User Entity的password屬性
在user.entity下新增password屬性
@Column({
nullable: true, // 因?yàn)榇藢傩院髞?lái)才加丈屹,不設(shè)置nullable無(wú)法新增此屬性
length: 100,
// 一般用repository.find不會(huì)出現(xiàn)此屬性
// 在QueryBuilder中select entity也不會(huì)出現(xiàn)
select: false,
})
password: string;
用postman測(cè)試,會(huì)發(fā)現(xiàn)所有返回的用戶(hù)都沒(méi)有帶password屬性
那如何在query的時(shí)候讓password出現(xiàn)呢
修改query伶棒, 新增addSelect讓password出現(xiàn)
.addSelect('u.password')
使用postman測(cè)試
密碼屬性出現(xiàn)
推薦一下我的公眾號(hào): 【 geekjc 】旺垒,微信號(hào): 【 c8706288 】一起學(xué)習(xí)交流編程知識(shí)彩库,分享經(jīng)驗(yàn),各種有趣的事先蒋。