美文网首页让前端飞Web前端之路
Nest.js学习之路(21)-TypeORM(8) Relat

Nest.js学习之路(21)-TypeORM(8) Relat

作者: cbw100 | 来源:发表于2019-07-17 10:12 被阅读1次

    参考TypeORM官网RelationBuilder

    RelationQueryBudiler

    顾名思义,RelationQuberyBuilder是特殊的QueryBuilder,typeorm提供来简化Entity Relations的操作,今天以更新为例

    one-to-many/many-to-one

    先从最简单的one-to-many/many-to-one,更新使用者所属平台为例,

    在user.service新增

    async updateUserPlatById(userId, platId){ // 传入userId及platId
            await this.userRepo.createQueryBuilder()
                            .relation(User, 'plat') // 指定载入relation
                            .of(userId) // 找对应的entity,可以是id或是queryed entity
                            .set(platId); // 更新(或是新增)platId
                            // .then(result => result); 回传void
            return await this.userRepo.findOne(userId, {relations: ['plat', 'roles']}); // 回传结果
        }
    

    在user.controller新增

    @Put(':userId/:platId')
        updateUserPlatById(@Param('userId') userId, @Param('platId') platId) {
            return this.userService.updateUserPlatById(userId, platId);
        }
    

    使用postman测试


    2018111501.png

    many-to-many

    与one-to-many差异不大,差别在于many-to-many用的是add或是addAndRemove

    在user.service下新增如下代码,

    async updateUserRolesByIds(userId, data: UserDTO){
            // 更新roles,必需先取的数据库现有的资料
            const user = await this.userRepo.findOne(userId, {relations: ['roles']});
            Logger.log(user);
            await this.userRepo.createQueryBuilder()
                                .relation(User, 'roles') // 指定载入relation
                                .of(userId) // 找对应的entity,可以是id或是queryed entity
                                // 第一个参数是要新增的roles,第二個参数是要移除的roles
                                // 当然可以用lodash对阵列做操作,得到新增的阵列跟移除的阵列
                                // 但builder API一次只能有add或是remove,所以用addAndRemove是最快的
                                .addAndRemove(data.roleIds, user.roles.map(role => role.id));
                                // .then(result => return result); 回传void
            return await this.userRepo.findOne(userId, {relations: ['dep', 'roles']});
        }
    

    为了测试方便,先修改原本user.controller下的@Put(':userId')

    @Put(':userId')
        updateUserRolesByIds(@Param('userId') userId, @Body() userDTO: UserDTO) {
            return this.userService.updateUserRolesByIds(userId, userDTO);
        }
    

    使用postman测试


    2018111502.png

    Refactor user.service里面的更新使用者方法

    把前面两个合起来,就可以完整更新User资料

    修改user.service下updateUserById方法

        async updateUserById(userId, data: UserDTO){
        const user = await this.userRepo.findOne(userId, {relations: ['roles']});
        await this.userRepo.createQueryBuilder()
                  .relation(User, 'roles')
                  .of(userId)
                  .addAndRemove(data.roleIds, user.roles.map(role => role.id))
                  .then(async () => { // 要串
                    await this.userRepo.createQueryBuilder()
                               .relation(User, 'plat')
                               .of(userId)
                               .set(data.platId);
                 });
        await this.userRepo.createQueryBuilder() // 更新非relation相关资料
                  .update(User) // 指定update哪一个entity
                  .set({ // 更新资料
                    name: data.name,
                    age: data.age,
                  })
                  // whereInIds是helper method
                  // 原本应为
                  // .where('id = :id', {id: userId})
                  .whereInIds(userId)
                  // .printSql() 可以用來除錯
                  .execute(); // 執行
        return await this.userRepo.findOne(userId, {relations: ['plat', 'roles']});
        }
    

    修改user.controller

        @Put(':userId')
        updateUserRolesByIds(@Param('userId') userId, @Body() userDTO: UserDTO) {
            return this.userService.updateUserById(userId, userDTO);
            // return this.userService.updateUserRolesByIds(userId, userDTO);
        }
    

    使用postman测试


    2018111503.png

    其余user service下的新增、删除、查询用querybuilder refactor,下一章继续

    推荐一下我的公众号: 【 geekjc 】,微信号: 【 c8706288 】一起学习交流编程知识,分享经验,各种有趣的事。

    tuiguang.png

    相关文章

      网友评论

        本文标题:Nest.js学习之路(21)-TypeORM(8) Relat

        本文链接:https://www.haomeiwen.com/subject/xrojfqtx.html