![](/img/trans.png)
[英]How to exclude entity field from returned by controller JSON. NestJS + Typeorm
[英]How to access relationship ID from Parent's joined field in NestJS/TypeORM
我正在设置一个使用 TypeORM 的 NestJS GraphQL API,并且在实现实体之间的关系时遇到了问题。
具体来说,TypeORM 关系运行良好,实体在数据库中正确链接。 但是,当我尝试查询 API 以获取结果时,问题就出现了。
现在我有 2 个实体,每个实体都有自己的解析器:用户和照片。 每个用户可以拥有多张照片,而每张照片只连接到一个用户(多对一)。
照片实体,与用户实体有关系
@ManyToOne(type => User, user => user.photos, {
onDelete: 'CASCADE',
})
@JoinColumn()
user: User;
用户实体,完成与照片实体的连接
@OneToMany(type => Photo, photo => photo.user, {
eager: true,
})
photos: Photo[];
用户解析器
@ResolveProperty('photos')
async photos(@Parent() user): Promise<Photo[]> {
return await this.service.readPhotos(user.id);
}
用户服务
async readPhotos(userId): Promise<Photo[]> {
return await this.photoRepository.find({
where: {
user: userId
}
});
}
*请注意,photoRepository 可以通过“用户”字段进行过滤。 *
照片解析器
@ResolveProperty('user')
async user(@Parent() photo): Promise<User> {
console.log(photo);
return await this.service.readUser(photo.user);
}
此照片解析器似乎包含问题; 控制台输出的照片对象表明,虽然@Parent 照片对象的所有静态字段都可用(如 ID、datePublished、URL),但由于某种原因,此处无法访问实际的“用户”字段。 所以'photo.user' 变量为空。 *请注意,这似乎表明 photoRepository 无法被“用户”字段过滤/访问。 *
照片服务
async readUser(userId): Promise<User> {
return await this.userRepository.findOne({
where: {
user: userId
}
});
}
这将返回 null,因为 userId 为空,因为之前的照片解析器无法访问“用户”字段。
为什么照片解析器无法访问@Parent 照片“用户”字段? 用户服务似乎能够按“用户”字段进行过滤就好了,但我似乎无法直接访问照片“用户”字段。
感谢您对此的任何帮助! 这两天一直在纠结这个。。。
所以你想访问用户是吧? photo.user
? 在FindOptions
有一个名为“关系”的键,它将为您获取并应用它。 所以在你的例子中
async readPhotos(userId): Promise<Photo[]> {
return await this.photoRepository.find({
where: {
user: userId
},
relations: ['user'],
});
}
现在应该是photo.user
。 另一种方式是相反的
async readUser(userId): Promise<User> {
return await this.userRepository.findOne({
where: {
user: userId
},
relations: ['photos'],
});
}
现在应该将user.photos
作为Photo
数组返回
你可以在这里找到更多FindOptions
用法的例子http://typeorm.io/#/find-options
希望这可以帮助!
我正在为一个类似的问题而苦苦挣扎,虽然@bashleigh 的解决方案在您希望整个实体返回时有效,但我只需要 id。 因此,如果这是您的情况,您可以传递loadRelationIds
选项,并将其设置为true
。
return await this.photoRepository.find({
where: {
id: photoId
},
loadRelationIds: true
});
这将仅以 id(字符串或整数)的形式返回用户。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.