Моделирование данных в Prisma с отношениями

У меня проблема с пониманием отношений и моделирования данных в 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.

person Roy    schedule 09.08.2020    source источник


Ответы (2)


Вы можете исправить эту ошибку, указав два поля отношений на PlayerInGame. У вас есть два поля отношений на Game. Следовательно, вам также понадобятся два противоположных поля отношения на PlayerInGame. В логике вашего приложения вы должны убедиться, что установлено только одно из этих двух полей отношения. Таким образом, только PlayerInGame.gameAsPlayer1 или PlayerInGame.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")
}
person mavilein    schedule 10.08.2020

Лучшим способом сделать это было бы отношение "многие ко многим". Вы можете добавить в игру столько же пользователей в будущем, и это, в свою очередь, будет масштабируемым.

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

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

Затем вы можете условно проверить количество игроков в игре и ограничить их в своей бизнес-логике.

person Ryan    schedule 10.08.2020
comment
Спасибо за Ваш ответ. Но будет ли это работать, когда я хочу добавить некоторую статистику, например выигранные игры, тузы и т. Д.? Это будет отличаться для каждой игры и пользователя, поэтому я подумал о добавлении PlayerInGame. - person Roy; 10.08.2020