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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 10:57:44