如何使用Prisma ORM获取新创建记录的ID用于后续操作?
在Prisma ORM中创建记录后获取ID以执行关联操作
背景
你习惯了Laravel Eloquent中用insertGetId获取新记录ID,再用该ID执行关联表操作,现在需要在Prisma中实现类似功能,尤其是批量创建场景。
1. 单个记录创建(create方法)
使用create方法创建单条记录时,Prisma会直接返回完整的新记录对象,包含自动生成的ID,直接提取即可:
// 创建单条折扣记录 const newDiscount = await db.discountedProducts.create({ data: { discountTypeId: 1, discountValue: 121, productId: parsedData[0].productId, }, }); // 用新记录ID执行关联操作 await db.productMultiImage.create({ data: { discountedProductId: newDiscount.id, photoName: uploadPath, createdAt: new Date(), }, });
2. 批量记录创建(createMany方法)
注意:你代码中使用create({ data: [...formattedData] })是错误的——create仅支持单条数据,批量创建必须用createMany。根据数据库类型,获取批量创建的ID分两种情况:
情况A:数据库支持返回插入ID(PostgreSQL、MySQL 8.0+等)
Prisma 4.16.0及以上版本,在支持RETURNING子句的数据库中,createMany会返回包含createdIds数组的结果,直接提取即可:
export async function action({ request }) { const inputData = await request.formData(); const parsedData = JSON.parse(inputData.get("data")); const formattedData = parsedData.map(data => ({ discountTypeId: 1, discountValue: 121, productId: data.productId, })); // 批量创建并获取ID const createResult = await db.discountedProducts.createMany({ data: formattedData, }); // 使用返回的createdIds执行关联操作 for (const discountId of createResult.createdIds) { // 示例:关联表插入操作 await db.productMultiImage.create({ data: { discountedProductId: discountId, photoName: uploadPath, createdAt: new Date(), }, }); } return redirect("/app"); }
情况B:数据库不支持返回插入ID(旧版MySQL、SQLite等)
这类数据库中createMany无法返回新记录ID,只能循环调用create方法逐一创建,虽然性能略低,但能获取每个记录的ID:
export async function action({ request }) { const inputData = await request.formData(); const parsedData = JSON.parse(inputData.get("data")); const formattedData = parsedData.map(data => ({ discountTypeId: 1, discountValue: 121, productId: data.productId, })); const createdIds = []; // 循环创建每条记录并收集ID for (const item of formattedData) { const newDiscount = await db.discountedProducts.create({ data: item, }); createdIds.push(newDiscount.id); } // 用收集到的ID执行关联操作 for (const discountId of createdIds) { await db.productMultiImage.create({ data: { discountedProductId: discountId, photoName: uploadPath, createdAt: new Date(), }, }); } return redirect("/app"); }
内容的提问来源于stack exchange,提问作者Wakil Ahmed
相关产品推荐
相关产品推荐

