如何从 NestJS/TypeORM 中 Parent 的 join 字段访问关系 ID

     2023-03-08     159

关键词:

【中文标题】如何从 NestJS/TypeORM 中 Parent 的 join 字段访问关系 ID【英文标题】:How to access relationship ID from Parent's joined field in NestJS/TypeORM 【发布时间】:2019-06-07 09:01:30 【问题描述】:

我正在设置一个使用 TypeORM 的 NestJS GraphQL API,但在实现实体之间的关系时遇到了麻烦。

具体来说,TypeORM 关系运行良好,并且实体在数据库中正确链接。但是,当我尝试查询 API 以获取结果时,问题就出现了。

现在我有 2 个实体,每个实体都有自己的解析器:用户和照片。每个用户可以拥有多张照片,而每张照片仅连接到一个用户(多对一)。

以下是实体与 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 可以通过“用户”字段进行过滤。 *

但是,此代码不起作用。它应该让我们查看连接到照片的用户,而不是返回 null。

图片解析器

@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
        
    );

由于之前的照片解析器无法访问“用户”字段,因此 userId 为空,因此返回 null。

结论

为什么照片解析器无法访问@Parent 照片“用户”字段?用户服务似乎可以通过“用户”字段进行过滤,但我似乎无法直接访问照片“用户”字段。

感谢您对此提供的任何帮助!这两天我一直在纠结这个……

【问题讨论】:

您也可以分享您的 GraphQL 架构吗?特别是您的照片和用户的定义 【参考方案1】:

所以你想访问用户是吧? 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'],
    );

这现在应该以 Photos 的数组形式返回 user.photos

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

希望这会有所帮助!

【讨论】:

【参考方案2】:

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

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

这将返回 user 作为 id(字符串或 int)。

【讨论】:

过滤从查询参数传递的数组。 NestJS,TypeORM

】过滤从查询参数传递的数组。NestJS,TypeORM【英文标题】:Filteranarraypassedfromqueryparams.NestJS,TypeORM【发布时间】:2021-03-1502:36:46【问题描述】:我用的是带有TypeORM的NestJS,数据库是MySQL,我想过滤多个可以传入的参数。前端有一... 查看详情

如何覆盖 NestJS/TypeORM 的Provider

】如何覆盖NestJS/TypeORM的Provider【英文标题】:HowtooverrideProviderforNestJS/TypeORM【发布时间】:2019-04-0306:21:24【问题描述】:api.controller.ts@Controller(\'api\')exportclassApiControllerconstructor()@Post()@Transaction()asyncroot(@Req()req: 查看详情

NestJS/TypeORM。 TypeORM 不更新数据库中的实体,而是使用旧的缓存实体

】NestJS/TypeORM。TypeORM不更新数据库中的实体,而是使用旧的缓存实体【英文标题】:NestJS/TypeORM.TypeORMdoesn\'tupdateentityinDB,usesoldcachedentityinstead【发布时间】:2021-06-0503:49:24【问题描述】:我整天都在尝试将实体保存到MySQL数据库中... 查看详情

NestJS + Typeorm + Graphql:嵌套关系中 DTO 的正确设计模式

】NestJS+Typeorm+Graphql:嵌套关系中DTO的正确设计模式【英文标题】:NestJS+Typeorm+Graphql:correctdesignpatternforDTOinnestedrelations【发布时间】:2019-10-2213:17:04【问题描述】:假设我有一个这样的Typeorm实体定义:@Entity()exportclassMyEntity@PrimaryG... 查看详情

NestJS typeorm - 无法创建实体

】NestJStypeorm-无法创建实体【英文标题】:NestJStypeorm-can\'tcreateentity【发布时间】:2019-11-1309:32:31【问题描述】:我正在尝试向我的TypeOrm(配置为mysql)添加一个Idea实体,并且导入似乎无法正常工作。添加文件后,typeorm没有成功... 查看详情

迁移文件中的 NestJS TypeORM 语法错误

】迁移文件中的NestJSTypeORM语法错误【英文标题】:NestJSTypeORMsyntaxerrorinmigrationfile【发布时间】:2020-08-2603:06:13【问题描述】:我正在浏览NestJS官方文档。我在Heroku上设置了PostgreSQL,与TypeORM连接,运行迁移,然后我的应用程序开... 查看详情

NestJS + TypeORM 中的 JoinTable 问题

】NestJS+TypeORM中的JoinTable问题【英文标题】:IssuewithJoinTableinNestJS+TypeORM【发布时间】:2021-04-2605:39:39【问题描述】:我在NestJS+TypeORM中遇到一个奇怪的问题。我几乎在一个实体中创建了一个ManyToMany关系,并且在关系的拥有方,我... 查看详情

找不到模块'@nestjs/typeorm'

】找不到模块\\\'@nestjs/typeorm\\\'【英文标题】:Cannotfindmodule\'@nestjs/typeorm\'找不到模块\'@nestjs/typeorm\'【发布时间】:2021-01-1810:46:47【问题描述】:我已经使用以下命令安装了TypeORM:Githubrepositorynpmi--save@nestjs/typeormtypeormuptodate,audite... 查看详情

什么是 nestjs typeorm 中的 getRepositoryToken 以及何时使用它?

】什么是nestjstypeorm中的getRepositoryToken以及何时使用它?【英文标题】:whatisgetRepositoryTokeninnestjstypeormandwhentouseit?【发布时间】:2021-04-1017:14:36【问题描述】:文档here如下:在对应用程序进行单元测试时,我们通常希望避免建立... 查看详情

NestJS TypeORM mongodb 在数组列中查找不起作用

】NestJSTypeORMmongodb在数组列中查找不起作用【英文标题】:NestJSTypeORMmongodbfindinanarraycolumndoesnotwork【发布时间】:2021-01-2011:29:10【问题描述】:所以我正在使用NestJs和带有mongodb的TypeORM进行项目。早些时候我们使用express和mongoose并... 查看详情

NestJs TypeORM 配置使用 AWS Parameter Store

】NestJsTypeORM配置使用AWSParameterStore【英文标题】:NestJsTypeORMconfigurationusingAWSParameterStore【发布时间】:2019-09-1813:30:10【问题描述】:NestJS新手,遇到了一个问题。对于我们的部署,我们需要从AWSParameterStore(SystemsManager)获取我们的... 查看详情

NestJs TypeORM无法连接到mysql

】NestJsTypeORM无法连接到mysql【英文标题】:NestJsTypeORMunabletoconnecttomysql【发布时间】:2019-08-1313:00:37【问题描述】:我正在尝试连接到MySQL。我已经在我的根目录中的.env文件中定义了db连接变量,并且我正在初始化app.module.ts文件... 查看详情

nestjs / TypeOrm 数据库事务

】nestjs/TypeOrm数据库事务【英文标题】:nestjs/TypeOrmdatabasetransaction【发布时间】:2019-05-0921:03:19【问题描述】:假设我们有2个服务,A和B。服务A具有执行以下操作的功能:验证数据调用服务B函数,对数据库进行更改做更多的事... 查看详情

TypeError:存储库方法不是函数(NestJS / TypeORM)

】TypeError:存储库方法不是函数(NestJS/TypeORM)【英文标题】:TypeError:Repositorymethodisnotafunction(NestJS/TypeORM)【发布时间】:2020-07-0118:29:08【问题描述】:我正在使用NestJS和TypeORM。尝试调用存储库的createMailLogEntry方法时,出现以下... 查看详情

NestJS + TypeORM:使用两个或更多数据库?

】NestJS+TypeORM:使用两个或更多数据库?【英文标题】:NestJS+TypeORM:Usetwoormoredatabases?【发布时间】:2019-01-3008:22:47【问题描述】:我从2天以来一直在尝试解决这个问题,也许我只是错过了这里的重点。我的目标是编写一个NestJS... 查看详情

NestJs TypeORM 异步配置

】NestJsTypeORM异步配置【英文标题】:NestJsTypeORMasyncconfiguration【发布时间】:2019-10-3104:29:31【问题描述】:我正在尝试使用@nestjs/typeorm模块并使用异步配置。在我的app.module.ts我有以下内容:@Module(controllers:[AppController,],exports:[Confi... 查看详情

Nestjs 与自定义存储库中的 Typeorm 事务

】Nestjs与自定义存储库中的Typeorm事务【英文标题】:NestjswithTypeormTransactionincustomrepository【发布时间】:2020-07-0214:02:59【问题描述】:我有一个像这样使用NestJS/Typeorm的自定义存储库类:importRepository,EntityRepository,getConnectionfrom\'typ... 查看详情

NestJS/TypeORM:无法读取未定义的属性“createQueryBuilder”

】NestJS/TypeORM:无法读取未定义的属性“createQueryBuilder”【英文标题】:NestJS/TypeORM:Cannotreadproperty\'createQueryBuilder\'ofundefined【发布时间】:2021-02-2710:25:06【问题描述】:在邮递员处调用“localhost:3000/contacts”(带或不带参数)返... 查看详情