【问题标题】:change a related field without mutating the original one更改相关字段而不改变原始字段
【发布时间】:2019-10-19 12:22:58
【问题描述】:

我有这个架构:

type Game {
  id: ID! @id
  status: Boolean @default(value: false)
  time: DateTime!
  location: String!
  stadium: String!
  teams: [Team!]! @relation(name: "BothTeams")
}
type Team {
  id: ID! @id
  name: String!
  abbrName: String!
  teamLogo: String!
  score: Int @default(value: 0)
  games: [Game!]! @relation(name: "BothTeams")
}

Game 类型通常会返回两支球队,每支球队都有一个得分字段。

所以如果我想稍后更新游戏,特别是分数字段,

我将不得不改变每场比赛的比分与改变的球队。

那么,有没有办法改变特定游戏的分数,而不改变原始分数。

【问题讨论】:

    标签: graphql prisma


    【解决方案1】:

    从概念上讲,score 并不是特定团队的真正属性。您希望将其表示为与团队和游戏相关联的单独实体。一种方法:

    type Game {
      id: ID! @id
      status: Boolean @default(value: false)
      time: DateTime!
      location: String!
      stadium: String!
      teams: [Team!]! @relation(name: "BothTeams")
      scores: [Score!]! @relation(name: "ScoresByGame")
    }
    type Team {
      id: ID! @id
      name: String!
      abbrName: String!
      teamLogo: String!
      games: [Game!]! @relation(name: "BothTeams")
    }
    type Score {
      id: ID! @id
      value: Int @default(value: 0)
      team: Team @relation(name: "ScoreTeam")
    }
    

    或者,您可以使用homeScore 字段和awayScore 字段来代替scores。无论哪种方式,您都将拥有一个 Score 节点,您可以在不影响其他游戏的情况下对其进行变异。 Team 的任何其他可能因游戏而异的属性都应进行类似处理(例如,如果您想包含玩该特定游戏的玩家)。

    【讨论】:

    • 这将是一个更好的方法,感谢丹尼尔的帮助。
    • Game.status 也应该在构建“仅附加”系统时被提取。 “版本化”分数可以包含时间(游戏开始的偏移量)和玩家(更改“作者”) - 构建游戏时间线(最后一个 => 游戏结果)。分数应与游戏相关(与 ScoresByGame 相反) - f.e.获取玩家更改结果的游戏列表。
    猜你喜欢
    • 1970-01-01
    • 2014-03-11
    • 2011-04-08
    • 1970-01-01
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    相关资源
    最近更新 更多