TypeORM:通过存储库更新数据(与关系)API
TypeORM: Updating data (with relations) via Repository API
我有两个实体(表):users 和 roles。两个实体之间存在多对一关系(一个用户可以拥有一个角色,角色可以与多个用户相关)。现在我想通过执行以下命令来更新用户实体(也可以包括用户角色的更新):
const user = await this.userRepository.preload(partialUser);
await this.userRepository.save(user);
return user;
预期行为
partialUser
(要更新的用户属性)与数据库中的用户数据合并,包括 role
user
(合并对象)保存到数据库
- 新的用户对象返回给调用者(包括角色)
会发生什么
- 用户合并了,但是
role
没有加载(但是如果我把子属性role
添加到partialUser
,没问题)
user
(合并对象)被保存到数据库(如果它是 partialUser
的一部分,也与 role
一起)
- 返回新用户对象,但缺少角色,如果角色未通过 partialUser
更新
问题
为什么 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[];
我有两个实体(表):users 和 roles。两个实体之间存在多对一关系(一个用户可以拥有一个角色,角色可以与多个用户相关)。现在我想通过执行以下命令来更新用户实体(也可以包括用户角色的更新):
const user = await this.userRepository.preload(partialUser);
await this.userRepository.save(user);
return user;
预期行为
partialUser
(要更新的用户属性)与数据库中的用户数据合并,包括role
user
(合并对象)保存到数据库- 新的用户对象返回给调用者(包括角色)
会发生什么
- 用户合并了,但是
role
没有加载(但是如果我把子属性role
添加到partialUser
,没问题) user
(合并对象)被保存到数据库(如果它是partialUser
的一部分,也与role
一起)- 返回新用户对象,但缺少角色,如果角色未通过 partialUser 更新
问题
为什么 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[];