两个字段可否引用另一模型同字段?Prisma对局关联模型优化问题
你可以通过显式多对多关联的方式实现需求,调整后的Prisma Schema如下:
model Player { id Int @id @default(autoincrement()) // 其余自定义玩家字段 matchups MatchupPlayer[] } model Matchup { id Int @id @default(autoincrement()) // 其余自定义对局字段,例如开赛时间、比分等 players MatchupPlayer[] } // 对局-玩家关联中间模型 model MatchupPlayer { id Int @id @default(autoincrement()) player Player @relation(fields: [playerId], references: [id]) playerId Int matchup Matchup @relation(fields: [matchupId], references: [id]) matchupId Int // 复合唯一约束,避免同一个玩家被重复加入同一场对局 @@unique([playerId, matchupId]) }
调整后的结构优势:
- Player模型仅需要
matchups一个关联字段,就可以查询到该玩家参与的所有对局,无需区分主客场属性 - 后续如果要拓展对局的参与人数(比如从2人对战改成多人对战),不需要修改表结构,仅调整业务层校验规则即可
如果需要限制每场对局仅允许2名玩家参与,可以在业务层新增写入校验:写入MatchupPlayer记录前,先校验对应matchupId的关联记录总数不超过2,也可以在数据库层新增触发器实现对应校验。
如果你不想新增中间表,坚持保留原来的Matchup双玩家字段结构,也可以在查询时手动合并两个关联字段的结果,示例代码如下:
const player = await prisma.player.findUnique({ where: { id: 目标玩家ID }, include: { homeMatchUps: true, awayMatchUps: true } }) // 合并得到该玩家参与的所有对局 const allMatchups = [...player.homeMatchUps, ...player.awayMatchUps]
这种方案仅在查询层做处理,不需要调整现有Schema结构,缺点是需要每次查询后手动做数据合并。
内容的提问来源于stack exchange,提问作者codedude
相关产品推荐
相关产品推荐

