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

TypeORM: Updating data (with relations) via Repository API

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

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

预期行为

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

会发生什么

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

问题

为什么 role 没有通过 preload 加载,也没有在 save 之后通过 return 加载?是 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']
});

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

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