如何使用Prisma Client的upsert函数关联多个关系?
问题:Prisma关联多个Profile关系时出现PrismaClientValidationError
错误详情
PrismaClientValidationError: Invalid `prisma.connection.upsert()` invocation: { where: { id: '' }, update: { userOneId: 'clbcb6z58000gyb31ez95frvh', userTwoId: 'clbcaz4bl000ayb31icwpzphu', isUserOneApproved: false, isUserTwoApproved: true, connectionRequestedOnDate: '2022-12-07T21:48:12.441Z', connectionAcceptedOnDate: undefined }, create: { userOneId: 'clbcb6z58000gyb31ez95frvh', ~~~~~~~~~~~~~ userTwoId: 'clbcaz4bl000ayb31icwpzphu', ~~~~~~~~ isUserOneApproved: false, isUserTwoApproved: true, connectionRequestedOnDate: '2022-12-07T21:48:12.441Z', connectionAcceptedOnDate: undefined, userOne: { connect: { id: 'clbcb6z58000gyb31ez95frvh' } }, userTwo: { connect: { id: 'clbcaz4bl000ayb31icwpzphu' } }, profile: { connect: { id: 'clbcb71l2000kyb31cclk79z3' } } } } Unknown arg `userOneId` in create.userOneId for type ConnectionCreateInput. Did you mean `userOne`? Available args: type ConnectionCreateInput { id?: String isUserOneApproved: Boolean isUserTwoApproved: Boolean connectionRequestedOnDate?: DateTime | Null connectionAcceptedOnDate?: DateTime | Null userOne: ProfileCreateNestedOneWithoutUserOneInput userTwo: ProfileCreateNestedOneWithoutUserTwoInput profile: ProfileCreateNestedOneWithoutConnectionInput } Unknown arg `userTwoId` in create.userTwoId for type ConnectionCreateInput. Did you mean `userTwo`? Available args: type ConnectionCreateInput { id?: String isUserOneApproved: Boolean isUserTwoApproved: Boolean connectionRequestedOnDate?: DateTime | Null connectionAcceptedOnDate?: DateTime | Null userOne: ProfileCreateNestedOneWithoutUserOneInput userTwo: ProfileCreateNestedOneWithoutUserTwoInput profile: ProfileCreateNestedOneWithoutConnectionInput }
当前Upsert代码实现
const createOrUpdateRole = await prisma.connection.upsert({ where: { id: id }, update: { userOneId: userOneId, userTwoId: userTwoId, isUserOneApproved, isUserTwoApproved, connectionRequestedOnDate, connectionAcceptedOnDate, }, create: { userOneId: userOneId, userTwoId: userTwoId, isUserOneApproved, isUserTwoApproved, connectionRequestedOnDate, connectionAcceptedOnDate, userOne: { connect: { id: userOneId } }, userTwo: { connect: { id: userTwoId } }, profile: { connect: { id: profileId } }, }, });
Prisma Schema定义
Profile模型
model Profile { id String @id @default(cuid()) firstName String? lastName String? image String? @db.Text userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) sensitive Sensitive[] userOne Connection[] @relation("userOne") userTwo Connection[] @relation("userTwo") connection Connection[] @relation("profile") @@index([userId]) }
Connection模型
model Connection { id String @id @default(cuid()) isUserOneApproved Boolean isUserTwoApproved Boolean connectionRequestedOnDate DateTime? connectionAcceptedOnDate DateTime? userOneId String userOne Profile @relation("userOne", fields: [userOneId], references: [id], onDelete: Cascade) userTwoId String userTwo Profile @relation("userTwo", fields: [userTwoId], references: [id], onDelete: Cascade) profileId String profile Profile @relation("profile", fields: [profileId], references: [id], onDelete: Cascade) @@index([userOneId]) @@index([userTwoId]) @@index([profileId]) }
问题原因
你在create参数中同时传入了外键字段(userOneId/userTwoId)和嵌套关联对象(userOne/userTwo),Prisma不允许这种重复定义关联的方式。当你使用嵌套的connect对象时,Prisma会要求统一通过关联对象来建立关系,而不是直接传外键ID。
解决方案
修改upsert的create部分,移除重复的外键字段,只保留嵌套关联对象;update部分可以直接使用外键ID或者嵌套关联,两种方式均支持:
const createOrUpdateRole = await prisma.connection.upsert({ where: { id: id }, update: { userOneId: userOneId, userTwoId: userTwoId, isUserOneApproved, isUserTwoApproved, connectionRequestedOnDate, connectionAcceptedOnDate, }, create: { isUserOneApproved, isUserTwoApproved, connectionRequestedOnDate, connectionAcceptedOnDate, userOne: { connect: { id: userOneId } }, userTwo: { connect: { id: userTwoId } }, profile: { connect: { id: profileId } }, }, });
这样修改后,Prisma就能正确识别关联关系,不会再抛出ValidationError。
内容的提问来源于stack exchange,提问作者Mathias Riis Sorensen
相关产品推荐
相关产品推荐

