【问题标题】:Prisma and NestJS Code-First GraphQL N+1 QuestionPrisma 和 NestJS 代码优先 GraphQL N+1 问题
【发布时间】: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


    【解决方案1】:

    在我发布问题后,我实际上使用以下代码使这个工作:

    return await this.prismaService.facilityType
            .findUnique({
              where: { id: facilityTypeId },
            })
            .Facility();
    

    任何人都可以帮助解释为什么最后的“.Facility()”需要被 VSCode 大写,这与 Prisma 文档中的 Fluid API 示例不同,它是小写的?我尝试将另一个查询转换为 Fluid API,因为我得到了这个查询,而另一个查询是小写的(例如“.facility()”)。

    如果我在这里不将其大写,则会出现错误。 Property 'facility' does not exist on type

    【讨论】:

      猜你喜欢
      • 2020-05-12
      • 1970-01-01
      • 2021-10-30
      • 2020-08-17
      • 2021-01-07
      • 2020-07-14
      • 1970-01-01
      • 2020-07-05
      • 2018-10-08
      相关资源
      最近更新 更多