如何在GraphQL中变异关系字段?

如何在GraphQL中变异关系字段?,graphql,Graphql,假设你有两种类型的玩家技能 type PlayerSkills { playerID: Player health: Int attack: Int defence: Int } type Player { playerID: ID! playerName: String balance: Int playerSkills: PlayerSkills inventory: [Item] } 如果您创建一个变种来添加一个新玩家,您将如何告诉GraphQL一个

假设你有两种类型的玩家技能

type PlayerSkills {
  playerID: Player
  health: Int
  attack: Int
  defence: Int
}

type Player {
  playerID: ID!
  playerName: String
  balance: Int
  playerSkills: PlayerSkills
  inventory: [Item]
}
如果您创建一个变种来添加一个新玩家,您将如何告诉GraphQL一个特定的玩家与一个特定的技能集合相关联

mutation (
  $playerID: ID!, 
  $playerName: String, 
  $balance: Int
  $playerSkills: PlayerPlayerSkillsRelation

) {
  createPlayer(data: {
    playerID: $playerID, 
    playerName: $playerName, 
    balance: $balance,
    playerSkills: $playerSkills
  }) {
    playerID
    playerName
    balance
    playerSkills {
      playerID
    }
  }
}

我认为你把输入部分复杂化了。通常,当您的突变操作与您的查询相同的数据时,它们即使不完全相同,也会非常相似。除非有其他要求,我会这样安排:

mutation (
  $playerID: ID!, 
  $playerName: String, 
  $balance: Int
  $playerSkills: PlayerSkillsInput
) {
  createPlayer(data: {
    playerID: $playerID, 
    playerName: $playerName, 
    balance: $balance,
    playerSkills: $playerSkills
  }) {
    playerID
    playerName
    balance
    playerSkills {
      playerID
    }
  }
}

input PlayerSkillsInput {
  health: Int
  attack: Int
  defence: Int
}
请注意,
PlayerSkillsInput
中既没有
playerSkillsRelation
,也没有字段
playerID
。输入玩家只需要掌握自己的技能,而与玩家无关,因为您可以在实现代码中自己推断出这一点。只有被创建的玩家才能拥有这些技能,所以你不需要额外的输入字段

不能完全确定
connect
disconnect
,但如果需要,可以轻松地将它们添加到
PlayerSkillsInput

mutation (
  $playerID: ID!, 
  $playerName: String, 
  $balance: Int
  $playerSkills: PlayerSkillsInput
) {
  createPlayer(data: {
    playerID: $playerID, 
    playerName: $playerName, 
    balance: $balance,
    playerSkills: $playerSkills
  }) {
    playerID
    playerName
    balance
    playerSkills {
      playerID
    }
  }
}

input PlayerSkillsInput {
  health: Int
  attack: Int
  defence: Int
}