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 中的数据建模与关系

Prisma 和 ApolloClient:防止前端覆盖关系的后端包含条件

prisma 按关系排序只有 _count 属性。不能按关系字段排序

与模型属性的 where 条件的雄辩关系

GraphQL / Prisma 中的相同类型关系

与 Prisma 2 相关的多个过滤器