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

如何在Prisma的Create语句中使用CreateMany批量创建关联模型?

问题描述

我想实现一条能同时接收关联模型数组的Create语句,以下是我的Prisma Schema:

model House {
  id        String   @id
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt

  property_name String     @db.VarChar(30)
  house_type    String     @db.VarChar(10)
  beds          Int
  baths         Int
  workspace     Int
  occupied      Boolean    @default(false)
  stay          DateTime[]

  amenities Amenity[]
  room      Room[]

  zipcode    String  @db.VarChar(5)
  address    Address @relation(fields: [address_id], references: [id])
  address_id Int
}

model Address {
  id Int @id @default(autoincrement())

  city       String
  state_code String  @db.VarChar(2)
  house      House[]
}

model Amenity {
  id Int @id @default(autoincrement())

  amenity_name String
  house        House  @relation(fields: [house_id], references: [id])
  house_id     String
}

model Room {
  id Int @id @default(autoincrement())

  room_number String
  occupied    Boolean @default(false)
  house       House   @relation(fields: [house_id], references: [id])
  house_id    String
}

目前我只能先创建House,再循环创建关联的Amenity和Room,代码如下:

createHomeDto.id = uuid();
const {
  amenities,
  room,
  ...home
} = createHomeDto;

await this.prisma.house.create({
  data: home
});

Object.entries(amenities).map(async ([key, value]) => {
  await this.prisma.amenity.create({
    data: {
      amenity_name: value.amenity_name,
      house: {
        connect: {
          id: home.id
        }
      }
    }
  })
});

Object.entries(room).map(async ([key, value]) => {
  await this.prisma.room.create({
    data: {
      room_number: value.room_number,
      house: {
        connect: {
          id: home.id
        }
      }
    }
  })
})

请问有没有更优的实现方案?

优化方案

当然有更优的方案——利用Prisma的嵌套创建能力,在一次house.create调用中同时创建关联的Amenity和Room,这样既减少数据库请求次数,又能保证操作的原子性(要么全部创建成功,要么全部失败)。

具体代码实现如下:

createHomeDto.id = uuid();
const { amenities, room, ...home } = createHomeDto;

// 统一在创建House时嵌套生成关联模型
await this.prisma.house.create({
  data: {
    ...home,
    // 批量创建关联的Amenity
    amenities: {
      create: Object.values(amenities).map(item => ({
        amenity_name: item.amenity_name
      }))
    },
    // 批量创建关联的Room
    room: {
      create: Object.values(room).map(item => ({
        room_number: item.room_number,
        // 若需要自定义occupied字段,可在此补充:occupied: item.occupied
      }))
    }
  }
});

核心说明:

  • 无需手动调用connect:Prisma会自动将新生成的House ID赋值给子模型的house_id字段,无需额外关联操作。
  • 原子性保障:整个操作是单次数据库事务,避免了部分模型创建成功、部分失败的不一致情况。
  • 效率提升:从原来的N+1次数据库请求(1次House创建+N次关联模型创建)减少为1次请求,性能更优。

内容的提问来源于stack exchange,提问作者itsninjabunny

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 06:25:22