You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Prisma如何通过关联的player姓名筛选更新awayinfo表数据

错误原因

  • prisma.awayinfo.update 默认是单条更新(对应底层updateOne),where参数仅支持传入当前awayinfo模型的字段作为筛选条件,PlayerID本身是Int类型,你传入嵌套对象不符合类型定义要求
  • Prisma 不支持在update操作的where条件中直接嵌套关联表查询,也不支持在where中写入select子查询的语法

正确实现方案

方案1:分两次查询(逻辑最直观)

先根据name查询到对应playerinfo的ID,再用ID作为条件更新awayinfo:

// 第一步:根据name查询playerinfo的ID
const player = await prisma.playerinfo.findUnique({
  where: { name: name },
  select: { ID: true }
})
if (!player) throw new Error('对应玩家不存在')

// 第二步:更新awayinfo
const result = await prisma.awayinfo.update({
  where: { PlayerID: player.ID },
  data: { IsAway: true }
})

方案2:从playerinfo端触发嵌套更新(推荐,仅一次数据库交互)

因为playerinfo和awayinfo是一对一关联关系,可以直接在更新playerinfo的时候嵌套更新关联的awayinfo,无需手动查询ID:

const result = await prisma.playerinfo.update({
  where: { name: name },
  data: {
    awayinfo: {
      update: {
        IsAway: true
      }
    }
  },
  // 可选配置:需要返回更新后的awayinfo数据时添加
  select: { awayinfo: true }
})

注意:如果playerinfo的name字段没有加@unique约束,这个写法会报错,要么给name加唯一约束,要么把update换成updateMany。

方案3:使用updateMany实现跨关系筛选

awayinfo的updateMany操作支持在where条件中嵌套关联表的筛选逻辑,因为两个模型是一对一关系,筛选后也只会更新一条数据:

const result = await prisma.awayinfo.updateMany({
  where: {
    playerinfo: {
      name: name
    }
  },
  data: { IsAway: true }
})
// 返回值格式为 { count: number },代表成功更新的行数

内容的提问来源于stack exchange,提问作者731

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 18:54:02