【问题标题】:TypeORM: Updating data (with relations) via Repository APITypeORM:通过 Repository API 更新数据(与关系)
【发布时间】:2019-03-25 01:56:55
【问题描述】:

我有两个实体(表):usersroles。两个实体之间存在多对一的关系(一个用户可以拥有一个角色,角色可以与多个用户相关联)。现在我想通过执行以下命令来更新用户实体(也可以包括用户角色的更新):

const user = await this.userRepository.preload(partialUser);
await this.userRepository.save(user);
return user;

预期行为

  1. partialUser(要更新的用户属性)与来自数据库的用户数据合并,包括 role
  2. user(合并对象)保存到数据库
  3. 新的用户对象返回给调用者(包括角色)

会发生什么

  1. 用户被合并,但是role没有加载(但是如果我给partialUser添加子属性role就可以了)
  2. user(合并对象)保存到数据库中(如果它是 partialUser 的一部分,也与 role 一起保存)
  3. 返回新的用户对象,但如果角色未通过 partialUser 更新,则缺少角色

问题

为什么在save 之后没有通过preloadreturn 加载role? TypeORM 存储库是否不适合关系,或者我使用不正确?

我的解决方法

目前我必须在保存后再次读取整个user实体,以便将完整的对象(包括role关系)返回给调用者。我认为那不是很有效。是这样打算的吗?

const user = await this.userRepository.preload(partialUser);
await this.userRepository.save(user);

return this.userRepository.findOne({
  where: { id: user.id },
  relations: ['role']
});

【问题讨论】:

    标签: node.js typeorm


    【解决方案1】:

    TypeORM 支持此类用例。这是使用急切加载标志完成的,即eager: true,您可以将其设置为关系。现在,每次您获取此记录时,默认情况下都会获取该关系并在响应中返回。您可以在用户模型中使用的示例代码:

    @ManyToMany(type => Role, role => role.User, {
      eager: true
    })
    public roles: Role[];
    

    【讨论】:

    • 您也可以在查询中使用关系。示例改编自他们的文档:const users= await userRepository.find({ relations: ["roles"] });
    猜你喜欢
    • 2021-07-16
    • 2021-09-06
    • 2023-03-31
    • 1970-01-01
    • 2019-09-11
    • 2022-01-22
    • 2021-02-20
    • 1970-01-01
    • 2011-06-06
    相关资源
    最近更新 更多