Node.js 如何从父级访问关系ID';NestJS/TypeORM中的s连接字段
我正在建立一个利用TypeORM的NestJS GraphQLAPI,但在实现实体之间的关系时遇到了问题 具体来说,TypeORM关系工作得很好,实体在数据库中正确链接。然而,当我试图查询API以获得结果时,问题就出现了 现在我有两个实体,每个实体都有自己的解析器:用户和照片。每个用户可以有多张照片,而每张照片仅连接到一个用户(多对一) 以下是实体与TypeORM的链接方式 照片实体,与用户实体有关系 用户实体,完成与照片实体的连接 这段代码有效,让我们检索用户的照片 用户解析器Node.js 如何从父级访问关系ID';NestJS/TypeORM中的s连接字段,node.js,graphql,nestjs,typeorm,Node.js,Graphql,Nestjs,Typeorm,我正在建立一个利用TypeORM的NestJS GraphQLAPI,但在实现实体之间的关系时遇到了问题 具体来说,TypeORM关系工作得很好,实体在数据库中正确链接。然而,当我试图查询API以获得结果时,问题就出现了 现在我有两个实体,每个实体都有自己的解析器:用户和照片。每个用户可以有多张照片,而每张照片仅连接到一个用户(多对一) 以下是实体与TypeORM的链接方式 照片实体,与用户实体有关系 用户实体,完成与照片实体的连接 这段代码有效,让我们检索用户的照片 用户解析器 @Resolv
@ResolveProperty('photos'))
异步照片(@Parent()user):承诺{
返回等待此.service.readPhotos(user.id);
}
用户服务
async readPhotos(userId):承诺{
返回等待此。光电沉积。查找({
其中:{
用户:userId
}
});
}
*请注意,光电探测器可以通过“用户”字段进行过滤*强>
但是,此代码不起作用。它应该让我们查看哪个用户连接到照片,而不是返回null。
光分解器
@ResolveProperty('user'))
异步用户(@Parent()photo):承诺{
控制台日志(照片);
返回等待this.service.readUser(photo.user);
}
此照片解析程序似乎包含问题;控制台输出的照片对象表明,尽管@Parent照片对象的所有静态字段(如ID、datePublished、URL)都可用,但由于某种原因,实际的“用户”字段在此不可访问。因此'photo.user'变量为空。
*请注意,这似乎表明光电探测器无法通过“用户”字段进行过滤/访问*强>
摄影服务
async readUser(userId):承诺{
返回等待this.userRepository.findOne({
其中:{
用户:userId
}
});
}
由于先前的照片解析程序无法访问“用户”字段,用户ID为空,因此返回null
结论
为什么照片解析程序不能访问@Parent Photo“user”字段?用户服务似乎能够通过“用户”字段进行筛选,但我似乎无法直接访问照片“用户”字段
谢谢你在这方面的帮助!在过去的两天里,我一直被这个问题难住了…所以你想访问这个用户,是吗<代码>照片。用户?在
FindOptions
中有一个名为“relations”的键,它将为您获取并应用该键。在你的例子中
async readPhotos(userId): Promise<Photo[]> {
return await this.photoRepository.find({
where: {
user: userId
},
relations: ['user'],
});
}
现在应该将user.photos
作为Photo
s的数组返回
您可以在这里找到更多的FindOptions
用法示例
希望这有帮助 我遇到了一个类似的问题,尽管@bashleigh的解决方案在需要返回整个实体时有效,但我只需要id。因此,如果是这样,您可以传递
loadRelationId
选项,并将其设置为true
return await this.photoRepository.find({
where: {
id: photoId
},
loadRelationIds: true
});
这将返回用户id(字符串或int)。您也可以共享您的GraphQL模式吗?特别是照片和用户的定义
@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
}
});
}
@ResolveProperty('user')
async user(@Parent() photo): Promise<User> {
console.log(photo);
return await this.service.readUser(photo.user);
}
async readUser(userId): Promise<User> {
return await this.userRepository.findOne({
where: {
user: userId
}
});
}
async readPhotos(userId): Promise<Photo[]> {
return await this.photoRepository.find({
where: {
user: userId
},
relations: ['user'],
});
}
async readUser(userId): Promise<User> {
return await this.userRepository.findOne({
where: {
user: userId
},
relations: ['photos'],
});
}
return await this.photoRepository.find({
where: {
id: photoId
},
loadRelationIds: true
});