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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 07:00:59