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
相关产品推荐
相关产品推荐

