Prisma 模式 - 从多个可能的外键(或关系)创建关系字段

Posted

技术标签:

【中文标题】Prisma 模式 - 从多个可能的外键(或关系)创建关系字段【英文标题】:Prisma schema - Create a relation field from multiple possible foreign keys (OR relation) 【发布时间】:2020-07-30 06:42:11 【问题描述】:

如何在 prisma 模式中创建一个relation field,以 2 个可能的 relation scalar fields 为目标?

例如,在足球比赛中,假设我们有以下 2 个模型:

model Match 
    team1Id     Int
    team1       Team        @relation("team1", fields: [team1Id], references: [id])

    team2Id     Int
    team2       Team        @relation("team2", fields: [team2Id], references: [id])


model Team 
    id          Int         @default(autoincrement()) @id
    name        String
    matches     Match[]     @relation( /* What to put here ? */ ) // <----

Team.matches 关系字段定义中添加什么以允许Team.matchs 包含球队从任何一方进行的任何比赛,作为team1 或作为team2?

【问题讨论】:

【参考方案1】:

这在 Prisma 中是不可能的!我在我们的repo for technical specifications 中创建了一个问题,以考虑改进此问题的方法!


解决方法

使用 Prisma,您始终需要在每个关系的两侧都有一个关系字段。这意味着您需要在 Team 上有两个关系字段,一个代表球队“作为球队 1”参加的比赛,另一个代表“作为球队 2”参加的比赛。

model Match 
  team1Id Int
  team1   Team @relation("team1", fields: [team1Id], references: [id])
  team2Id Int
  team2   Team @relation("team2", fields: [team2Id], references: [id])
  @@id([team1Id, team2Id])


model Team 
  id             Int     @default(autoincrement()) @id
  name           String
  matchesAsTeam1 Match[] @relation("team1")
  matchesAsTeam2 Match[] @relation("team2")

【讨论】:

这不适用于 MongoDB。我需要对 MongoDB 进行任何特殊处理吗? id 字段类型对我来说是字符串。

以上是关于Prisma 模式 - 从多个可能的外键(或关系)创建关系字段的主要内容,如果未能解决你的问题,请参考以下文章

外键为啥必须是唯一键?为啥至少唯一键才能作为其他表的外键?不唯一为啥不可以?

Laravel Eloquent 关系与多个带有“OR”的外键

Restkit 在嵌套的外键关系中使用 @parent

如何处理 django-rest-framework 中 url 模式中的外键关系

映射到多个主键的外键列

尝试使用 Laravel 中的外键从数据库中提取多行