相关文章推荐
英姿勃勃的地瓜  ·  如何使用grouping ...·  2 天前    · 
没读研的小蝌蚪  ·  重置debezium ...·  1 年前    · 
耍酷的沙发  ·  Android ...·  1 年前    · 
性感的西装  ·  scala - spark.sql ...·  1 年前    · 

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的過程也不順,也就沒有分享。

Github source code