Prisma 更新与 WHERE 属性中的关系
Posted
技术标签:
【中文标题】Prisma 更新与 WHERE 属性中的关系【英文标题】:Prisma update with relation in WHERE property 【发布时间】:2022-01-11 23:04:49 【问题描述】:鉴于这些架构:
model awayinfo
PlayerID Int @id
IsAway Boolean
playerinfo playerinfo @relation(fields: [PlayerID], references: [ID])
model playerinfo
name String @db.VarChar(15)
ID Int @id @unique @default(autoincrement())
awayinfo awayinfo?
如果我拥有的唯一标识符是球员姓名而不是 ID,我将如何为 awayinfo 表创建 prisma SQL 更新?
我尝试了什么:
我尝试将一些东西传递到 WHERE 部分,如下所示:
const result = await prisma.awayinfo.update(
where:
PlayerID:
name: name
,
data:
IsAway: true,
);
但它总是给我错误:
Invalid `prisma.awayinfo.update()` invocation:
Argument PlayerID: Got invalid value
name: 'Dummy'
on prisma.updateOneawayinfo. Provided Json, expected Int.
我非常绝望,甚至尝试过像这样的不稳定选择
const result = await prisma.awayinfo.update(
where:
PlayerID:
playerinfo:
Where:
name: name
,
select: ID: true,
, .....
但显然这也行不通。 我想知道我在这里遗漏了什么,我在 prisma 文档的 WHERE 子句中找不到任何条件示例
【问题讨论】:
【参考方案1】:这里有两个问题,第一个在您的 Prisma 架构/数据模型中,第二个在您的查询中。
使name
独一无二
首先,如果您想用name
属性仅唯一标识playerinfo
表中的记录,则此属性必须为unique
。否则,如果有多个具有相同 name
属性的记录,您的数据库(和 Prisma)不可能知道要更新哪个玩家信息记录。
相应地更新您的架构:
model playerinfo
name String @unique @db.VarChar(15)
ID Int @id @unique @default(autoincrement())
awayinfo awayinfo?
重写更新查询
由于您的更新中的where
条件引用了属性playerinfo
模型,因此您应该从那里开始查询。这是它的样子:
const data = await prisma.playerinfo.update(
where:
name: name
,
data:
awayinfo:
update:
IsAway: true
)
【讨论】:
这个答案很详细,完全解决了问题。我自己想出了独特的部分,但再次感谢您指出这一点! 欢迎您!乐于助人:D以上是关于Prisma 更新与 WHERE 属性中的关系的主要内容,如果未能解决你的问题,请参考以下文章
Prisma 和 ApolloClient:防止前端覆盖关系的后端包含条件