【发布时间】:2022-07-29 08:10:24
【问题描述】:
我刚刚开始在 NestJS 中构建代码优先的 GraphQL,并且正在努力解决 Prisma 中的 N+1 问题。特别是,使用 FindUnique 是我面临最大挑战的地方,因为 1-n 关系的“n”侧不是唯一的,所以我不知道如何正确使用 Prisma Fluid API。
这是我的 Prisma 架构:
model Facility {
id String @id @default(uuid())
name String
facilityType FacilityType @relation(fields: [facilityTypeId], references: [id])
facilityTypeId String
}
model FacilityType {
id String @id @default(uuid())
description String @unique
Facility Facility[]
}
设施实体
import { ObjectType, Field } from '@nestjs/graphql';
import { FacilityType } from '../../facility-types/entities/facility-type.entity';
@ObjectType()
export class Facility {
@Field({ description: 'Facility UUID' })
id: string;
@Field({ description: 'Facility Name' })
name: string;
@Field((type) => [FacilityType], { description: 'Facility Type Entity' })
facilityType: FacilityType;
@Field({ description: 'Facility Type UUID' })
facilityTypeId: string;
}
设施类型实体
import { ObjectType, Field } from '@nestjs/graphql';
import { Facility } from '../../facilities/entities/facility.entity';
@ObjectType()
export class FacilityType {
@Field({ description: 'Facility Type UUID' })
id: string;
@Field({ description: 'Facility Type Description' })
description: string;
@Field((type) => [Facility], {
description: 'Facility Type Facility Entities',
})
facilities: Facility[];
}
此解析器有效,但存在 N+1 问题,因为它为每个 FacilityType 运行 @ResolveField "findMany"。
import { Resolver, Query, ResolveField, Parent } from '@nestjs/graphql';
import { FacilityType } from './entities/facility-type.entity';
import { PrismaService } from 'src/prisma/prisma.service';
import { Facility } from '../facilities/entities/facility.entity';
@Resolver(() => FacilityType)
export class FacilityTypesResolver {
constructor(private readonly prismaService: PrismaService) {}
// Get all facility types
@Query(() => [FacilityType], { name: 'facilityTypes' })
async getFacilityTypes() {
return await this.prismaService.facilityType.findMany();
}
// Resolve facilities
// Has N + 1 Problem
@ResolveField('facilities', (returns) => [Facility])
async resolveFacilities(@Parent() facilityType: FacilityType) {
return await this.prismaService.facility.findMany({
where: { facilityTypeId: facilityType.id },
});
}
}
如果有人可以帮助我重写 ResolveField Prisma 代码以使用 Fluid API,我将不胜感激,或者如果这不是我应该做的,那么解释会很棒。谢谢!
【问题讨论】:
标签: nestjs prisma prisma-graphql