如何利用 Prisma 的隐式关系来创建以下关系? (一对多,多对多,一对一)

Posted

技术标签:

【中文标题】如何利用 Prisma 的隐式关系来创建以下关系? (一对多,多对多,一对一)【英文标题】:How can I leverage Prisma's implicit relations to create the following relation? (one-many, many-many, one-one) 【发布时间】:2022-01-08 23:42:57 【问题描述】:

我正在学习 Prisma,

我想尽可能地利用 Prisma 的隐式关系来处理以下关系(后来我想使用 nexus 来编写查询):

1 个用户可以属于许多对话(因为它是参与者)

1 Conversation 有一个数组 os 用户(称为参与者)

1 个用户可以拥有许多消息(作为作者)

1 条消息可以有 1 个用户(作为作者)

1 对话有一组消息(称为文本)

1 条消息只能属于 1 个对话

到目前为止,我已经想出了这个(但我非常怀疑它是否正确,因为在与 nexus 一起使用时它的行为不像我想要的那样):

model User 
  id            String         @id @default(uuid())
  conversations Conversation[]


model Message 
  id        String   @id @default(uuid())
  authorId       String
  conversationId String
  author         User         @relation(fields: [authorId], references: [id])
  conversation   Conversation @relation(fields: [conversationId], references: [id])


model Conversation 
  id        String   @id @default(uuid())
  participants User[]
  messages     Message[]

我能否获得一些指示/帮助以继续?

【问题讨论】:

【参考方案1】:

按照您的要求列表,此架构已准备就绪。只需在 User 模型上添加 messages 字段来声明它的关系。

应该是这样的:

model User 
  id            String         @id @default(uuid())
  conversations Conversation[]
  messages      Message[]


model Message 
  id             String       @id @default(uuid())
  authorId       String
  conversationId String
  author         User         @relation(fields: [authorId], references: [id])
  conversation   Conversation @relation(fields: [conversationId], references: [id])


model Conversation 
  id           String    @id @default(uuid())
  participants User[]
  messages     Message[]

您在使用 Nexus 时遇到任何具体问题吗?

我有一个视频教程,可以帮助您获得一些额外的指导: https://www.youtube.com/watch?v=sWlzqRB5Xro

【讨论】:

【参考方案2】:

我相信这个架构会为您解决这个问题。如果你想了解更多,我不久前给了talk about this topic。

model User 
  id            String         @id @default(uuid())
  messages      Message[]
  conversations Conversation[]


model Message 
  id             String       @id @default(uuid())
  author         User         @relation(fields: [authorId], references: [id])
  authorId       String
  conversation   Conversation @relation(fields: [conversationId], references: [id])
  conversationId String


model Conversation 
  id       String    @id @default(uuid())
  messages Message[]
  members  User[]

【讨论】:

以上是关于如何利用 Prisma 的隐式关系来创建以下关系? (一对多,多对多,一对一)的主要内容,如果未能解决你的问题,请参考以下文章

JS:关系运算符的隐式转化

论文解读基于TransS驱动的隐式篇章关系识别的联合学习框架

关系运算符中的隐式转换

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

Prisma:在显式多对多关系中创建或连接记录

NestJS-Prisma 如何使用关系字段创建记录?