如何过滤 Prisma ORM 中的关系
How to filter on relation in Prisma ORM
我目前正在从事一项课程服务。用户可以注册和注销课程。整个系统构建在微服务架构中,这意味着用户由另一个服务管理。因此,课程服务的数据模型如下所示:
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,然后使用到 return 课程的映射。这行得通,但我不喜欢这种解决方案,如果行得通,我更喜欢第一个查询:
(我使用本指南来编写第一个查询: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] ]
}
]
正如我们所见,第一个查询无法正常工作。有人可以给我提示吗?我有什么遗漏的吗?
根据您提到的文档,您需要使用 some
而不是 every
,因为如果匹配,您至少需要返回一个用户。
const result1 = await this.prisma.course.findMany({
where: { enrollmentCourse: { some: { userId: user.id } } },
include: { enrollmentCourse: true }
});
这应该给出 user
注册的所有课程
我目前正在从事一项课程服务。用户可以注册和注销课程。整个系统构建在微服务架构中,这意味着用户由另一个服务管理。因此,课程服务的数据模型如下所示:
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,然后使用到 return 课程的映射。这行得通,但我不喜欢这种解决方案,如果行得通,我更喜欢第一个查询: (我使用本指南来编写第一个查询: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] ]
}
]
正如我们所见,第一个查询无法正常工作。有人可以给我提示吗?我有什么遗漏的吗?
根据您提到的文档,您需要使用 some
而不是 every
,因为如果匹配,您至少需要返回一个用户。
const result1 = await this.prisma.course.findMany({
where: { enrollmentCourse: { some: { userId: user.id } } },
include: { enrollmentCourse: true }
});
这应该给出 user
注册的所有课程