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

Prisma+GraphQL一对一/一对多关系配置及创建Box外键报错求解

错误诱因

  • 关联操作写法错误:Schema中Box的外键存储字段是set(字符串类型,存储Sets表的name值),实际的关系映射字段是set_list。你在create操作中错误将connect关联逻辑写到了外键存储字段set上,而非关系字段set_list,Prisma无法正确识别关联逻辑。
  • 关联数据不存在:即使修正写法后,如果传入的input.set值在Sets表的name字段中没有对应记录,也会触发外键约束失败,常见原因包括拼写错误、大小写不匹配、目标Set未提前创建。
  • 附带逻辑错误:mutation中传入的game是对象结构{name:"yu"},但resolver中写成了input.game[0].name,把game误当作数组取第一个元素,会导致查不到对应的Games记录。

修复方案

1. 修正Resolver逻辑

关联操作有两种合法写法二选一即可,同时修正game查询的错误:

createBox: async (_: any, { input }: any, context: Context) => {
  // 修正game查询:game是对象不是数组,去掉[0]
  const find = await context.prisma.games.findFirst({
    where: {
      name: {
        contains: input.game.name,
        mode: "insensitive"
      }
    }
  });

  // 可选提前校验Set是否存在,避免外键报错
  const existSet = await context.prisma.sets.findUnique({
    where: { name: input.set }
  });
  if (!existSet) {
    throw new Error(`名称为${input.set}的Set不存在,请先创建`);
  }

  // 写法1:用关系字段set_list做connect
  return await context.prisma.box.create({
    data: {
      box_number: input.box_number,
      box_second_number: input.secondary_number,
      gameid: find?.id,
      set_list: {
        connect: {
          name: input.set
        }
      }
    }
  });

  // 写法2:直接给外键字段set赋值,不需要connect
  // return await context.prisma.box.create({
  //   data: {
  //     box_number: input.box_number,
  //     box_second_number: input.secondary_number,
  //     gameid: find?.id,
  //     set: input.set
  //   }
  // });
},

2. 校验Sets表数据

确认传入的input.set值Crucibile of War Unlimit是否在Sets表中真实存在,重点检查拼写是否正确(例如是否应为Crucible of War Unlimited),如果不存在需要先创建对应的Set记录再创建Box。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 02:45:02