如何在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
相关产品推荐
相关产品推荐

