如何从 Parent 在 NestJS/TypeORM 中的加入字段访问关系 ID
How to access relationship ID from Parent's joined field in NestJS/TypeORM
我正在设置一个利用 TypeORM 的 NestJS GraphQL API,但在实现实体之间的关系时遇到了问题。
具体而言,TypeORM 关系运行良好,实体在数据库中正确链接。但是,当我尝试查询 API 以获取结果时,问题就出现了。
现在我有 2 个实体,每个实体都有自己的解析器:用户和照片。每个用户可以拥有多张照片,而每张照片只关联一个用户 (Many-to-One)。
以下是实体与 TypeORM 的链接方式
照片实体,与用户实体有关系
@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 可以通过 'user' 字段进行过滤。 *
但是,此代码不起作用。它应该让我们查看哪个用户连接到照片,而不是 returns null.
照片解析器
@ResolveProperty('user')
async user(@Parent() photo): Promise<User> {
console.log(photo);
return await this.service.readUser(photo.user);
}
这个照片解析器似乎包含问题;控制台输出的照片 object 表明虽然 @Parent 照片 object 的所有静态字段都可用(如 ID、发布日期、URL),但对于由于某些原因,此处无法访问实际的 'user' 字段。所以 'photo.user' 变量为空。
* 请注意,这似乎表明 photoRepository 无法过滤 by/access 'user' 字段。 *
图片服务
async readUser(userId): Promise<User> {
return await this.userRepository.findOne({
where: {
user: userId
}
});
}
此 returns 为空,因为 userId 为空,因为之前的照片解析器无法访问 'user' 字段。
结论
为什么照片解析器无法访问 @Parent 照片 'user' 字段?用户服务似乎能够通过 'user' 字段进行过滤,但我似乎无法直接访问照片 'user' 字段。
感谢您对此的任何帮助!这两天我一直被这个难住了...
所以你想访问用户是吧? photo.user
?在 FindOptions
中有一个名为 'relations' 的键,这将为您获取并应用它。所以在你的例子中
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'],
});
}
现在应该 return user.photos
作为 Photo
的数组
您可以在此处找到 FindOptions
用法的更多示例 http://typeorm.io/#/find-options
希望对您有所帮助!
我一直在努力解决类似的问题,尽管如果您想要整个实体 returned,@bashleigh 的解决方案仍然有效,但我只需要 ID。因此,如果是这种情况,您可以传递 loadRelationIds
选项,并将其设置为 true
.
return await this.photoRepository.find({
where: {
id: photoId
},
loadRelationIds: true
});
这将 return 用户作为 ID(字符串或整数)。
我正在设置一个利用 TypeORM 的 NestJS GraphQL API,但在实现实体之间的关系时遇到了问题。
具体而言,TypeORM 关系运行良好,实体在数据库中正确链接。但是,当我尝试查询 API 以获取结果时,问题就出现了。
现在我有 2 个实体,每个实体都有自己的解析器:用户和照片。每个用户可以拥有多张照片,而每张照片只关联一个用户 (Many-to-One)。
以下是实体与 TypeORM 的链接方式
照片实体,与用户实体有关系
@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 可以通过 'user' 字段进行过滤。 *
但是,此代码不起作用。它应该让我们查看哪个用户连接到照片,而不是 returns null.
照片解析器
@ResolveProperty('user')
async user(@Parent() photo): Promise<User> {
console.log(photo);
return await this.service.readUser(photo.user);
}
这个照片解析器似乎包含问题;控制台输出的照片 object 表明虽然 @Parent 照片 object 的所有静态字段都可用(如 ID、发布日期、URL),但对于由于某些原因,此处无法访问实际的 'user' 字段。所以 'photo.user' 变量为空。 * 请注意,这似乎表明 photoRepository 无法过滤 by/access 'user' 字段。 *
图片服务
async readUser(userId): Promise<User> {
return await this.userRepository.findOne({
where: {
user: userId
}
});
}
此 returns 为空,因为 userId 为空,因为之前的照片解析器无法访问 'user' 字段。
结论
为什么照片解析器无法访问 @Parent 照片 'user' 字段?用户服务似乎能够通过 'user' 字段进行过滤,但我似乎无法直接访问照片 'user' 字段。
感谢您对此的任何帮助!这两天我一直被这个难住了...
所以你想访问用户是吧? photo.user
?在 FindOptions
中有一个名为 'relations' 的键,这将为您获取并应用它。所以在你的例子中
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'],
});
}
现在应该 return user.photos
作为 Photo
的数组
您可以在此处找到 FindOptions
用法的更多示例 http://typeorm.io/#/find-options
希望对您有所帮助!
我一直在努力解决类似的问题,尽管如果您想要整个实体 returned,@bashleigh 的解决方案仍然有效,但我只需要 ID。因此,如果是这种情况,您可以传递 loadRelationIds
选项,并将其设置为 true
.
return await this.photoRepository.find({
where: {
id: photoId
},
loadRelationIds: true
});
这将 return 用户作为 ID(字符串或整数)。