当前位置: 首页 > 知识库问答 >
问题:

如何从NestJS/TypeORM中父母的连接字段访问关系ID

韦熙云
2023-03-14

我正在建立一个利用TypeORM的NestJS GraphQLAPI,但在实现实体之间的关系时遇到了问题。

具体来说,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
        }
    });
}

*请注意,光电探测器可以通过“用户”字段进行过滤*

光分解器

@ResolveProperty('user')
async user(@Parent() photo): Promise<User> {
    console.log(photo);
    return await this.service.readUser(photo.user);
}

此照片解析程序似乎包含问题;控制台输出的照片对象表明,尽管@Parent照片对象的所有静态字段(如ID、datePublished、URL)都可用,但由于某种原因,实际的“用户”字段在此不可访问。所以这张照片。用户的变量为空。*请注意,这似乎表明Photopository无法通过“用户”字段进行过滤/访问*

摄影服务

async readUser(userId): Promise<User> {
    return await this.userRepository.findOne({
        where: {
            user: userId
        }
    });
}

由于先前的照片解析程序无法访问“用户”字段,用户ID为空,因此返回null。

为什么照片解析程序不能访问@Parent Photo“user”字段?用户服务似乎能够通过“用户”字段进行筛选,但我似乎无法直接访问照片“用户”字段。

感谢您对此的任何帮助!过去两天我一直被这个难倒...

共有2个答案

万嘉熙
2023-03-14

我遇到了一个类似的问题,尽管@bashleigh的解决方案在您希望返回整个实体时有效,但我只需要id。因此,如果您是这样的情况,您可以传递loadRelationIds选项,并将其设置为true

return await this.photoRepository.find({
 where: {
  id: photoId
 },
 loadRelationIds: true
});

这将返回用户id(字符串或int)。

慕容齐智
2023-03-14

所以你想访问用户,嗯<代码>照片。用户?在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'],
    });
}

这现在应该返回user.photos作为Photos的数组

您可以在这里找到更多的FindOptions用法示例http://typeorm.io/#/find-options

希望这有帮助!

 类似资料:
  • 问题内容: 我想从返回的JSON中排除密码字段。我正在使用NestJS和Typeorm。 针对此问题提供的解决方案不适用于我或NestJS。如果需要,我可以发布我的代码。还有其他想法或解决方案吗?谢谢。 问题答案: 我建议创建一个利用class-transformer库的拦截器: 然后,只需使用装饰器排除属性,例如:

  • 目前,我尝试学习nestjs,因此我遵循官方(cat-)教程构建了一个基本的用户身份验证系统。 当您访问API以更改用户名或密码时,请求应检查用户是否为有效用户(从数据库读取用户)。为了存储用户,我已经有了mongodb连接。 我目前正在琢磨如何在警卫中获得数据库模块/访问权限。 防护正在工作,但只返回true,我尝试注入数据库模块,但没有成功。 使用findOne方法扩展UserService类

  • 假设我有一个类型化实体定义,如下所示: 所以它有几个实体关系,OneToMany/onetomone 在制作DTO时,我该如何实现这一点? 这里我有一个例子DTO: 我不清楚通过Graphql的最佳方法 当前graphql接口: 如果我正在设计一个传统的RESTful服务,我会通过一个单独的endpoint在DB中创建文档,等待成功返回 然后在创建新的(在单独的终结点)时,将这些id指定为字段中的

  • 我使用NestJS与TypeOrm连接在MySQL,但返回一个错误:'没有存储库的"用户"被发现。看起来这个实体没有注册在当前的“默认”连接中?' 没有TypeOrm,我可以运行服务器。 “用户”是我的实体。 app.module 使用者单元 user.entity 谁能告诉我怎么了? 谢谢你的帮助!

  • 文章实体 标签实体 然后我测试新增,随便添加几条数据 查询文章id=1 查询标签id=6 删除文章没问题 但是,删除标签id=6就报错了。服务器错误