One call, many tables
Placing an order touches three tables: find the customer, insert the order, insert each item. A nested write does it in one call — and Prisma runs it in a transaction, so either everything is saved or nothing is.
create, connect, connectOrCreate
import { PrismaClient } from "@prisma/client";
const prisma = new PrismaClient();
const order = await prisma.order.create({
data: {
customer: { connect: { email: "[email protected]" } },
items: {
create: [
{ qty: 2, dish: { connect: { name: "Momo" } } },
{ qty: 1, dish: { connect: { name: "Masala tea" } } },
],
},
},
include: { items: { include: { dish: true } } },
});
console.log(order.items.map((i) => `${i.qty} × ${i.dish.name}`));
await prisma.dish.create({
data: {
name: "Lassi", price: 90, veg: true,
category: { connectOrCreate: { where: { name: "dessert" }, create: { name: "dessert" } } },
},
});
await prisma.order.update({
where: { id: order.id },
data: { items: { create: { qty: 1, dish: { connect: { name: "Lassi" } } }, deleteMany: { qty: 1, dishId: 6 } } },
});
console.log(await prisma.orderItem.count({ where: { orderId: order.id } }));