【问题标题】:How to filter on relation in Prisma ORM如何在 Prisma ORM 中过滤关系
【发布时间】:2021-08-30 15:07:59
【问题描述】:

我目前正在从事课程服务。用户可以注册和注销课程。整个系统构建在微服务架构中,这意味着用户由另一个服务管理。因此,课程服务的数据模型如下所示:

model course {
  id                Int                @id @default(autoincrement())
  orderNumber       Int                @unique
  courseNumber      String             @unique @db.VarChar(255)
  courseName        String             @db.VarChar(255)
  courseOfficer     String             @db.VarChar(255)
  degree            String             @db.VarChar(255)
  ectCount          Int
  faculty           String             @db.VarChar(255)
  isWinter          Boolean            @default(false)
  isSummer          Boolean            @default(false)
  courseDescription String?            @db.VarChar(255)
  enrollmentCourse  enrollmentCourse[]
}

model enrollmentCourse {
  id       Int    @id @default(autoincrement())
  userId   String @db.VarChar(1024)
  course   course @relation(fields: [courseId], references: [id])
  courseId Int
}

我想查找某个用户已注册的所有课程。 我写了2个查询。一个人浏览了课程并尝试在注册课程上进行过滤。但是,这个不起作用,我把所有的课程都拿回来了。而第二个则遍历enrollmentCourse,然后使用映射返回课程。这有效,但我不喜欢这个解决方案,如果它有效,我更喜欢第一个查询: (我使用本指南来编写第一个查询:here

const result1 = await this.prisma.course.findMany({
  where: { enrollmentCourse: { every: { userId: user.id } } },
  include: { enrollmentCourse: true }
});

console.log('Test result 1: ');
console.log(result1);

const result2 = await this.prisma.enrollmentCourse.findMany({
  where: { userId: user.id },
  include: { course: { include: { enrollmentCourse: true } } }
});

console.log('Test result 2: ');
console.log(result2.map((enrollment) => enrollment.course));

如果现在用户没有注册课程,则两个查询的结果是:

Test result 1:
[
  {
    id: 2,
    orderNumber: 1,
    courseNumber: 'test123',
    courseName: 'testcourse',
    courseOfficer: 'testcontact',
    degree: 'Bachelor',
    ectCount: 5,
    faculty: 'testfaculty',
    isWinter: true,
    isSummer: false,
    courseDescription: 'test.pdf',
    enrollmentCourse: []
  }
]
Test result 2:
[]

如果现在用户已经注册了课程,它看起来像这样:

Test result 1:
[
  {
    id: 2,
    orderNumber: 1,
    courseNumber: 'test123',
    courseName: 'testcourse',
    courseOfficer: 'testcontact',
    degree: 'Bachelor',
    ectCount: 5,
    faculty: 'testfaculty',
    isWinter: true,
    isSummer: false,
    courseDescription: 'test.pdf',
    enrollmentCourse: [ [Object] ]
  }
]
Test result 2:
[
  {
    id: 2,
    orderNumber: 1,
    courseNumber: 'test123',
    courseName: 'testcourse',
    courseOfficer: 'testcontact',
    degree: 'Bachelor',
    ectCount: 5,
    faculty: 'testfaculty',
    isWinter: true,
    isSummer: false,
    courseDescription: 'test.pdf',
    enrollmentCourse: [ [Object] ]
  }
]

我们可以看到第一个查询不能正常工作。任何人都可以给我一个提示吗?我有什么遗漏的吗?

【问题讨论】:

    标签: postgresql nestjs relation prisma


    【解决方案1】:

    根据您提到的文档,您需要使用some 而不是every,因为如果匹配,您至少需要返回一个用户。

    const result1 = await this.prisma.course.findMany({
      where: { enrollmentCourse: { some: { userId: user.id } } },
      include: { enrollmentCourse: true }
    });
    

    这应该给出user 注册的所有课程

    【讨论】:

      猜你喜欢
      • 2015-04-30
      • 2020-04-14
      • 2022-08-03
      • 1970-01-01
      • 2019-07-06
      • 2015-04-04
      • 2023-03-23
      • 1970-01-01
      • 2022-10-19
      相关资源
      最近更新 更多