【问题标题】:Data modeling in Prisma with relationsPrisma 中的数据建模与关系
【发布时间】:2020-11-29 13:22:29
【问题描述】:

我在理解 Prisma 中的关系和数据建模时遇到问题。我有一个关于两个可以参加网球比赛的用户的“简单”示例。所以我有:

Model User {
  id      Int @id 
  name    String 
}

Model Game { 
  id        Int @id 
  player1   PlayerInGame
  player2   PlayerInGame
}

Model PlayerInGame {
  id      Int @id
  player  User
  game    Game
}

它给了我这个错误:

Error validating model "Game": Ambiguous relation detected. The fields `player1` and `player2` in model `Game` both refer to `PlayerInGame`. Please provide different relation names for them by adding `@relation(<name>).

我该如何解决这个问题? 提前致谢。

我也尝试了 @relation 字段,但这给了我以下错误:

model Game {
  id        Int          @id @default(autoincrement())
  createdAt DateTime     @default(now())
  player1   PlayerInGame @relation("player1")
  player2   PlayerInGame  @relation("player2")
}


Error validating model "Game": Automatic related field generation would cause a naming conflict. Please add an explicit opposite relation field.

【问题讨论】:

    标签: javascript data-modeling prisma


    【解决方案1】:

    您可以通过在PlayerInGame 上提供两个关系字段来修复此错误。 Game 上有两个关系字段。因此,您还需要PlayerInGame 上的两个相反关系字段。在您的应用程序逻辑中,您必须确保仅设置这两个关系字段之一。所以根据你的业务领域只需要设置PlayerInGame.gameAsPlayer1PlayerInGame.gameAsPlayer2即可。

    model User {
      id      Int @id 
      name    String 
    }
    
    model Game { 
      id        Int @id 
      player1   PlayerInGame @relation("GamePlayer1")
      player2   PlayerInGame @relation("GamePlayer2")
    }
    
    model PlayerInGame {
      id            Int   @id
      player        User
      gameAsPlayer1 Game? @relation("GamePlayer1")
      gameAsPlayer2 Game? @relation("GamePlayer2")
    }
    

    【讨论】:

      【解决方案2】:

      最好的方法是多对多关系。您将来也可以向游戏中添加尽可能多的用户,并且可以依次进行扩展。

      model User {
        id    Int    @id
        name  String
        games Game[]
      }
      
      model Game {
        id    Int    @id
        name  String
        users User[]
      }
      

      然后您可以有条件地检查游戏中的玩家数量并在您的业务逻辑中限制他们。

      【讨论】:

      • 感谢您的回答。但是,当我想添加一些统计数据时,这是否也有效,比如赢得的比赛、ace 等?每个游戏和用户都会有所不同,这就是我考虑添加 PlayerInGame 的原因。
      猜你喜欢
      • 2022-01-06
      • 1970-01-01
      • 2021-09-06
      • 2021-07-07
      • 2022-01-11
      • 2017-09-29
      • 2020-09-14
      • 2011-08-25
      • 2021-03-17
      相关资源
      最近更新 更多