TypeORM Repository已經寫好常用對資料庫新增、修改、搜尋(find說明文件)、刪除資料
TypeORM Repository API列表
如果要更細部的建立Query,TypeORM提供Query Builder相關API,以API的方式去組SQL Query,比較彈性。但相對於repository API,QueryBuilder比較容易出錯,如果對SQL沒有很熟的話,加上打字串比例增加(容易打錯)....
使用QueryBuilder只要在注入的repository變數呼叫createQueryBuilder,
例如要以部門名稱搜尋使用者,並按照使用者名稱排序
新增getUsersByDepName於users.service.ts
async getUsersByDepName(depName: string){
return await this.userRepo
.createQueryBuilder('u') // 指定User別名為u
// 指定join user的roles關聯屬性,並指定別名為r,並設定搜尋條件
.leftJoinAndSelect('u.roles', 'r')
// 指定join user的dep關聯屬性,並指定別名為d,並設定搜尋條件
.leftJoinAndSelect('u.dep', 'd')
// 設定條件
.where('u.isActive = :isActive', {isActive: true})
.andWhere('d.depName like :name', { name: `%${depName.toLowerCase()}%`})
// 以username降冪排序
.orderBy('username', 'DESC')
// 回傳多筆資料
.getMany();
// 回傳上面API所組出來的Raw SQLㄝ, debug用
// .getSql()
}
到app.controller新增路由
...
@Get('query/user')
queryByDepName(@Query('depName') depName){
return this.usersService.getUsersByDepName(depName);
}
...
使用postman測試
實際產生的SQL
SELECT "u"."id" AS "u_id", "u"."username" AS "u_username", "u"."email" AS "u_email", "u"."isActive" AS "u_isActive", "u"."depId" AS "u_depId", "r"."id" AS "r_id", "r"."roleName" AS "r_roleName", "d"."id" AS "d_id", "d"."depName" AS "d_depName" FROM "My_Users" "u" LEFT JOIN "my__users_roles_role" "u_r" ON "u_r"."myUsersId"="u"."id" LEFT JOIN "role" "r" ON "r"."id"="u_r"."roleId" LEFT JOIN "Departments" "d" ON "d"."id"="u"."depId" WHERE "u"."isActive" = $1 AND "d"."depName" = $2 ORDER BY username DESC
實際資料
或許是習慣.net的FluentAPI,TypeORM顯得卡卡,今天花蠻多時間在除錯的,還有另外Custom Repository自己try的過程也不順,也就沒有分享。
明天繼續