Graphql 如何为事件、团队和成员之间的关系定义模式

Graphql 如何为事件、团队和成员之间的关系定义模式,graphql,prisma,prisma-graphql,Graphql,Prisma,Prisma Graphql,在Prisma中,我想对以下内容进行建模,但我不确定如何建模 type Event { id: ID! @unique players: [User]! @relation(name: "EventPlayers") teams: [Team]! @relation(name: "EventTeams") ... } type User { id: ID! @unique eventsPlayed: [Event]! @relation(name: "EventPlay

在Prisma中,我想对以下内容进行建模,但我不确定如何建模

type Event {
  id: ID! @unique
  players: [User]! @relation(name: "EventPlayers")
  teams: [Team]! @relation(name: "EventTeams")
  ...
}

type User {
  id: ID! @unique
  eventsPlayed: [Event]! @relation(name: "EventPlayers")
  ...
}

type Team {
  id: ID! @unique
  event: Event! @relation(name: "EventTeams")
  members: [User]! @relation(name: ?????)
  ...
}
约束条件
  • 每个
    团队成员
    必须参加
    活动。球员
  • 每个
    事件。玩家只能分配给一个(或无)团队
  • 问题: 我有一种感觉,我需要一种多对多的关系,但我正在努力解决这个问题。我与团队成员的关系是什么?????。我的做法正确吗

    更多信息(以防有用) 我打算为创建团队创建一个拖放界面。
    事件中列出的人。球员
    ,但尚未被分配为
    团队。成员
    将处于
    未分配的
    范围内。将它们拖到团队中,将它们分配为
    团队成员。但是,我想查询所有玩家,作为
    events{players{id}}
    events{teams{members{id}}}

    更新 在仔细考虑之后,我正在考虑一种不同的方法来解决这个问题。这是一个更新的模式,我希望你能对它有所想法/投入

    type Event {
      id: ID! @unique
      users: [EventUser!]!
      teams: [Team!]!
      title: string
    }
    
    type EventUser {
      event: Event!
      user: User!
      role: EventRole!
    }
    
    type User {
      id: ID! @unique
      events: [EventUser!]!
      name: string
    }
    
    type Team {
      event: Event!
      members: [EventUser!]!
      name: string
    }
    
    enum EventRole {
      ADMIN
      COORDINATOR
      JUDGE
      PLAYER
      REVIEWER
      SPONSOR
    }
    

    你的模型大部分是准确的。您需要做一些小的更改:

  • 使用
    @relation
    指令:仅当关系不明确时才需要它。例如,自我关系。在你的情况下你不需要它。这是一种传统的思维方式
  • 关系中的可空性:考虑<代码>玩家:[用户] < <代码>关系。它说玩家字段不能为空。它必须是一个列表。但是它使
    User
    成为可选的,这意味着您可以让
    players=[user1,null,user2]
    。你可能不想要这个。这适用于几乎所有的对多关系
  • 用户
    类型应具有可选的
    团队
    字段。将有一些用户不是任何团队的成员
  • 通过上述调整,您的模式将如下所示:

    type Event {
        id: ID! @unique
    
        # Note DOUBLE EXCLAMATION
        # Ensure that User, as well as players, are not null.
        players: [User!]!
    
        # Note DOUBLE EXCLAMATION
        # Ensure that Team and teams are not null.
        teams: [Team!]!
    }
    
    
    type User {
        id: ID! @unique
    
        eventsPlayed: [Event!]!
        team: Team
    }
    
    
    type Team {
        id: ID! @unique
    
        event: Event!
        members: [User!]!
    
        # Added an extra key for keeping track of past events if required
        pastEvents: [Event!]!
    }
    

    谢谢你的回复,也谢谢你解释这个双重感叹号。我肯定是想错了。问题是,每个
    团队
    只存在于单个事件中,因此将过去的事件显示为团队类型的一部分是没有意义的。用户可以属于许多团队。我添加了一个新的模式。我喜欢你的想法。@ChrisGeirman,看起来不错。另外,如果您不需要
    EventRole
    ,那么可以去掉
    EventUser
    模型。而且,您缺少
    团队的ID
    。否则,它是完美的。谢谢!我一直在玩它,到目前为止效果很好。