Prisma 更新与 WHERE 属性 中的关系

Prisma update with relation in WHERE property

鉴于这些模式:

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 table 创建 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 子句中找不到任何条件示例

这里有两个问题,第一个是你的 Prisma schema/data 模型,第二个是你的查询。

使name独一无二

首先,如果你想在 playerinfo table 中唯一标识一条记录 只需 name 属性 ,这个属性必须unique。否则,您的数据库(和 Prisma)不可能知道 哪个 玩家信息记录要更新,以防有多个记录具有相同的 name 属性。

相应地更新您的架构:

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