Prisma的connectOrCreate方法where条件是否支持使用AND组合查询?
问题原因
- Prisma中
connectOrCreate的where参数仅支持传入唯一索引/主键对应的查询条件,你当前报错是因为AccountNumber模型没有定义userId+accountNum的联合唯一索引,所以AccountNumberWhereUniqueInput类型不支持这两个字段的组合查询,也不支持在这个场景下用AND拼接条件。
解决步骤
- 首先修改Prisma Schema,给
AccountNumber添加联合唯一约束
model AccountNumber { id Int @id @default(autoincrement()) org Organization @relation(fields: [orgId], references: [id]) orgId Int user User @relation(fields: [userId], references: [id]) userId Int accountNum String holdings Holding[] // 新增联合唯一索引 @@unique([userId, accountNum]) }
修改后运行prisma migrate dev生成新的数据库迁移,同时更新Prisma客户端类型。
- 调整业务代码的
connectOrCreate参数,不需要用AND拼接条件,直接传入联合唯一索引对应的查询字段即可:
const holding = await client.holding.create({ data: { holdingNum, accountNum: { connectOrCreate: { where: { // 该字段是Prisma根据联合唯一索引自动生成的,命名规则为多个字段下划线拼接,可通过TS类型提示确认 userId_accountNum: { userId: loggedInUser.id, accountNum: accountNumber } }, create: { accountNumber, user: { connect: { id: loggedInUser.id, }, }, org: { connect: { orgCode, }, }, }, }, }, product: { connectOrCreate: { where: { prodCode, }, create: { prodCode, prodName, }, }, }, }, });
替代方案
如果不想新增联合唯一索引,就不能使用connectOrCreate实现该逻辑,需要先手动查询AccountNumber是否存在,不存在则先创建,再关联到新建的Holding记录,可以通过数据库事务保证操作的原子性。
内容的提问来源于stack exchange,提问作者broheat
相关产品推荐
相关产品推荐

