postgresql - 如何在 Prisma ORM 中过滤关系

标签 postgresql nestjs relation prisma

我目前正在从事类(class)服务工作。用户可以注册和取消注册类(class)。整个系统采用微服务架构构建,这意味着用户由另一个服务管理。因此,类(class)服务的数据模型如下所示:

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
}

我想查找某个用户已注册的所有类(class)。 我写了2个查询。我们浏览一下类(class)并尝试筛选注册类(class)。然而,这个不起作用,我拿回了所有类(class)。而第二个则检查注册类(class),然后使用映射返回类(class)。这是可行的,但我不喜欢这个解决方案,并且更喜欢第一个查询(如果它有效): (我使用本指南来编写第一个查询: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));

如果现在用户未注册类(class),则两个查询的结果为:

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:
[]

如果现在用户已注册类(class),则如下所示:

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] ]
  }
]

正如我们所见,第一个查询无法正常工作。有人能给我提示吗?我有什么遗漏的吗?

最佳答案

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

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

这应该提供用户注册的所有类(class)

关于postgresql - 如何在 Prisma ORM 中过滤关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68976639/

相关文章:

java - 使用 hibernate 在 Postgres 上设置随机种子

typescript - 我的类验证器如何验证联合字符串 |数字?

javascript - 如何使用 Nestjs 和 Multer 读取上传的文件 (text/.csv)

django - 在 django 中运行syncdb时找不到关系

php - Laravel 关系表用户和地址

ruby-on-rails - 在相关模型中更改属性后运行 before_save

postgresql - 从至少有 2 条评论的类(class)开始选择评论最多的类(class)

postgresql - Dovecot SQL 查询错误 - 为什么?

postgresql - 我可以从整个数据库的 pg_dump 中只恢复一个模式吗?

npm 运行开始 :dev in NestJs not to rebuild when i make some change in my code