在Prisma的Upsert操作中获取新建的关联Ticket记录ID
问题
现有Prisma Schema如下:
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 }
需求是:客户购买新票时,创建新的Ticket记录;若客户不存在则同时创建关联的Client记录。目前用以下代码实现了功能,但操作仅返回Client记录,需要获取新建的Ticket ID,想知道能否在一次操作中完成,还是必须额外查询:
const ticketOrder = { // 票的详情 }; const client = await prisma.client.upsert({ where: { email: email, }, update: { tickets: { create: [ ticketOrder ] } }, create: { first: first, last: last, email: email, tickets: { create: [ ticketOrder ] } } });
解决方案
有两种方式可以在一次操作中获取新建的Ticket ID,不需要额外查询:
方式一:在Client Upsert时关联返回Tickets
在upsert操作中添加include字段,让返回的Client对象包含关联的Tickets列表,之后从列表中提取最新创建的Ticket ID:
const ticketOrder = { // 票的详情 }; const client = await prisma.client.upsert({ where: { email }, update: { tickets: { create: [ticketOrder] } }, create: { first, last, email, tickets: { create: [ticketOrder] } }, include: { tickets: true } // 包含所有关联的Ticket记录 }); // 提取刚创建的Ticket ID(新增的票会排在数组末尾) const newTicketId = client.tickets[client.tickets.length - 1].id;
方式二:直接创建Ticket并关联Client(更推荐)
反过来通过prisma.ticket.create操作,结合connectOrCreate来处理Client的创建/关联,这样操作直接返回Ticket对象,还可以通过select只获取需要的ID,更高效:
const ticketOrder = { // 票的详情:pricePaid, currency, productId等 }; const newTicket = await prisma.ticket.create({ data: { ...ticketOrder, client: { connectOrCreate: { where: { email }, // 按email查找Client create: { first, last, email } // 不存在则创建 } } }, select: { id: true } // 仅返回ID字段,减少数据传输 }); const ticketId = newTicket.id;
这种方式逻辑更直观,直接围绕Ticket创建展开,同时完成Client的关联/创建,一步拿到需要的ID。
内容的提问来源于stack exchange,提问作者philolegein
相关产品推荐
相关产品推荐

