You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 17:46:26