Prisma 模式中的一对多自相关

Fis*_*uto 2 database prisma

我想创建一个简单的表:

Users
---
id
name
friends
Run Code Online (Sandbox Code Playgroud)

friends字段应该是其他用户 ID 的数组。我正在尝试为此定义一个架构schema.prisma

model User {
  id      String  @id @default(uuid())
  name    String
  friends User[]
}
Run Code Online (Sandbox Code Playgroud)

保存文件会自动完成模式:

model User {
  id      String  @id @default(uuid())
  name    String
  friends User[]  @relation("UserToUser")
  User    User?   @relation("UserToUser", fields: [userId], references: [id])
  userId  String?
}
Run Code Online (Sandbox Code Playgroud)

我不知道如何解释这一点。我已经阅读了关于一对多自我关系Prisma 文档,但是因为它指出

该关系表示如下:

  • “一个用户有零个或一个老师”
  • “一个用户可以有零个或多个学生”

我怀疑这是我想要的。如何在没有“用户有零个或一个教师”部分的情况下获得“一个用户可以有零个或多个学生”?

Rya*_*yan 5

在这里你需要一个User有一个或多个朋友的关系。这将导致多对多的自我关系,因为 aUser可以有很多朋友,也User可以是 other 的朋友Users

这可以按如下方式完成:

model User {
  id              String @id @default(uuid())
  name            String
  friends         User[] @relation("friends")
  friendsRelation User[] @relation("friends")
}
Run Code Online (Sandbox Code Playgroud)

thefriendsRelation是一个额外的字段,可以忽略,因为它仅用于存储多对多关系。

User与朋友一起创建一个看起来像这样:

  await prisma.user.create({
    data: {
      name: 'user 1',
      friends: { create: [{ name: 'user 2' }, { name: 'user 3' }] },
    },
  })
Run Code Online (Sandbox Code Playgroud)

查询所有用户和他们的朋友将是:

await prisma.user.findMany({ include: { friends: true } })
Run Code Online (Sandbox Code Playgroud)