如何使用Prisma Client upsert函数连接到多个关系?



当我试图将多个关系连接到我的Profile表时,我得到以下错误消息:

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
}

我的prisma 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 } },
},
});

运行该函数时,我的期望是使用各自的id将userOne和userTwo连接到我的Profile表。这样做的原因是,我可以查询连接,然后读取userOne和userTwo的配置文件数据。

这是我在schema.prisma中定义的模型:

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])
}
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])
}

如果我决定只连接其中一个,例如使用userOne: { connect: { id: userOneId } }的userOneId,那么该函数按预期运行,但是一旦我开始定义多个,我就会得到上面提到的错误。我错过了什么?

这个错误是非常自我描述的:

Unknown arg `userOneId` in create.userOneId for type ConnectionCreateInput

既然你已经在Prisma操作中传递了userOne: {connect: {id: '.....' } },你不(也不应该)也传递了userOneId。你只需要userOne: {connect.....userTwo: {connect.....

你的操作将会像这样结束:

const createOrUpdateRole = await prisma.connection.upsert({
where: {
id: id
},
update: {
// You can have __either__ `userOneId: 'value'` or `userOne: {connect....` here
// but not both
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
}
},
},
});

最新更新