先建一个Prisma Schema,用于后面查询与过滤的数据操作
javascript
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
createdAt DateTime @default(now())
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
title String
content String?
published Boolean @default(false)
views Int @default(0)
createdAt DateTime @default(now())
authorId Int
author User @relation(fields: [authorId], references: [id])
categories Category[]
}
model Category {
id Int @id @default(autoincrement())
name String @unique
posts Post[]
}
some、every、none
在进行to-many操作时,任何支持where条件的prisma方法,都可以在针对关系字段的过滤中使用它们,比如:
findeMany()、findFirst()、update/updateMany()、delete/deleteMany()
javascript
// ① some:至少有一篇已发布的文章
const usersWithAtLeastOnePublished = await prisma.user.findMany({
where: {
posts: {
some: { published: true },
},
},
})
// ② every:所有文章都已发布(注意:没有任何文章的用户也会被匹配)
const usersAllPublished = await prisma.user.findMany({
where: {
posts: {
every: { published: true },
},
},
})
// ③ none:没有任何已发布的文章
const usersWithNoPublished = await prisma.user.findMany({
where: {
posts: {
none: { published: true },
},
},
})
过滤操作符
equals、not、in、notIn、lt、lte、gt、gte、contains、startsWith、endsWith、has、hasEvery、hasSome、isEmpty
复合条件
javascript
{
AND: [...], // 所有条件都满足
OR: [...], // 任一条件满足
NOT: {...}, // 条件不满足
}
一段代码示例:
javascript
// AND(隐式):多个条件同时满足
const users1 = await prisma.user.findMany({
where: {
name: { not: null },
posts: {
some: { published: true },
},
},
})
// 显式 AND
const users2 = await prisma.user.findMany({
where: {
AND: [
{ name: { contains: 'a' } },
{ posts: { some: { views: { gt: 100 } } } },
],
},
})
// OR:满足任意一个条件
const users3 = await prisma.user.findMany({
where: {
OR: [
{ email: { endsWith: '@example.com' } },
{ posts: { some: { published: true } } },
],
},
})
// NOT:取反
const users4 = await prisma.user.findMany({
where: {
NOT: {
posts: {
some: { published: false },
},
},
},
})
// 混合:AND + OR + NOT + 关系过滤
const users5 = await prisma.user.findMany({
where: {
AND: [
{ createdAt: { gte: new Date('2025-01-01') } },
{
OR: [
{ posts: { some: { views: { gt: 1000 } } } },
{ posts: { every: { published: true } } },
],
},
{
NOT: { email: { endsWith: '@spam.com' } },
},
],
},
})
排序
javascript
orderBy: { field: 'asc' } // 单列升序
orderBy: { field: 'desc' } // 单列降序
orderBy: [{ f1: 'asc' }, { f2: 'desc' }] // 多列排序
总结示例
javascript
const users = await prisma.user.findMany({
where: {
AND: [
{ name: { in: ['Alice', 'Bob', 'Charlie'] } },
{ posts: { some: { published: true } } },
],
},
orderBy: [
{ createdAt: 'desc' },
{ name: 'asc' },
],
include: {
posts: {
where: { published: true },
orderBy: { createdAt: 'desc' },
take: 1,
},
},
})