TypeORM:通过存储库API更新数据(带有关系)

cvh*_*ger 6 node.js typeorm

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

const user = await this.userRepository.preload(partialUser);
await this.userRepository.save(user);
return user;
Run Code Online (Sandbox Code Playgroud)

预期行为

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

怎么了

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

为什么role不通过via preloadreturnafter 加载save?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']
});
Run Code Online (Sandbox Code Playgroud)

Ris*_*der 4

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

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