在Prisma中创建关系

  • 本文关键字:关系 创建 Prisma prisma
  • 更新时间 :
  • 英文 :


我刚刚开始使用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操作中一样使用selectinclude来包含引用对象,例如

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

最新更新