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

