首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Prisma ORM中过滤关系

如何在Prisma ORM中过滤关系
EN

Stack Overflow用户
提问于 2021-08-29 20:27:54
回答 1查看 84关注 0票数 0

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

代码语言:javascript
复制
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。然而,这个不起作用,我得到了所有的课程。而第二个则遍历enrollmentCourse,然后使用映射来返回课程。这是可行的,但我不喜欢这个解决方案,如果可行的话,我更喜欢第一个查询:(为了编写第一个查询,我使用了这个指南:here)

代码语言:javascript
复制
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));

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

代码语言:javascript
复制
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:
[]

如果用户现在已经注册了课程,则如下所示:

代码语言:javascript
复制
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] ]
  }
]

正如我们所看到的,第一个查询不能正确工作。有谁能给我个提示吗?我是不是漏掉了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-30 05:35:04

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

代码语言:javascript
复制
const result1 = await this.prisma.course.findMany({
  where: { enrollmentCourse: { some: { userId: user.id } } },
  include: { enrollmentCourse: true }
});

这将提供user注册的所有课程

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68976639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档