我刚刚开始使用Prisma,并有以下模式:
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}
model Client {
id Int @id @default(autoincrement())
email String @unique
first String?
last String?
tickets Ticket[]
}
model Ticket {
id String @id @default(uuid())
purchasedAt DateTime @default(now())
pricePaid Int
currency String @db.VarChar(3)
productId String
client Client @relation(fields: [clientId], references: [id])
clientId Int
}
当客户端购买新票证时,如果客户端不存在,我想创建一个新的票证条目和相关的客户端条目。令我惊讶的是,下面的方法居然奏效了:
const ticketOrder = {
// details
};
const client = await prisma.client.upsert({
where: {
email: email,
}, update: {
tickets: {
create: [ ticketOrder ]
}
}, create: {
first: first,
last: last,
email: email,
tickets: {
create: [ ticketOrder ]
}
}
});
然而,返回的只是客户端条目,而我需要的是新创建的票证条目(实际上,只是新创建的票证条目的id)。有没有办法一次性得到它,或者我必须在upsert
执行后做一些查询?您可以像在find
操作中一样使用select
或include
来包含引用对象,例如
const client = await prisma.client.upsert({
where: {
email: email,
},
update: {
tickets: {
create: [ ticketOrder ]
}
},
create: {
first: first,
last: last,
email: email,
tickets: {
create: [ ticketOrder ]
}
},
include: {
tickets: true
}
});
返回所有的票。
对我来说,如果你主要想创建一个票证,那么扰乱客户端似乎很奇怪。您可以创建一个票据并创建或连接客户端:
const ticket = await prisma.ticket.create({
data: {
// ...
client: {
connectOrCreate: // ...
}
},
})
见:https://www.prisma.io/docs/concepts/components/prisma-client/relation-queries connect-or-create-a-record