如何使用 Prisma 和 GraphQL 创建 object 类型的自解析数组

How to make self resolving array of object types with Prisma and GraphQL

也许标题不准确,但我真的不知道该怎么形容了。我浏览了多个文档和描述,但仍然无法弄明白。

我想在我的用户类型上实现 followers/following 查询之类的基本社交媒体。我正在使用 MySQL,为此我创建了一个名为 Follow 的单独 table,因为它是一个 many-to-many 连接。

这是我的 table 在数据库中的 pseudo-ish 表示,没有不必要的列:

Table - User
  user_id primary key Int

Table - Follow
  follow_er foreign_key -> User(user_id) Int
  follow_ed foreign_key -> User(user_id) Int

用户可以“充当”follow_er 这样我就可以获得关注的人

一个用户可以是 follow_ed,所以我可以获得关注者。

我的 Prisma 架构如下所示:

model User {
  user_id      Int      @id @default(autoincrement())
  following    Follow[] @relation("follower")
  followed     Follow[] @relation("followed")
}

model Follow {
  follow_er      Int
  follower       User     @relation("follower", fields: [follow_er], references: [user_id])
  follow_ed      Int
  followed       User     @relation("followed", fields: [follow_ed], references: [user_id])

  @@id([follow_er, follow_ed])
  @@map("follow")
}

通过执行此操作,我可以获得关注者并关注 object 附加到用户的根查询:

const resolvers = {
    Query: {
        user: async (parent, arg, ctx) => {
            const data = await ctx.user.findUnique({
                where: {
                    user_id: arg.id
                },
                include: {
                    following: true,
                    followed:true
                }
            })
            return data
        }....

这是我尝试创建的 GraphQL 模式:

type Query{
    user(id: Int!): User
}

type User{
    id: ID
    following: [User]
    followed: [User]
}

所以我可以得到类似的东西:

query {
  user(id: $id) {
    id
    following {
       id
      }
    followed{
        id
      }
    }
  }
}

但是我无法让它工作,因为即使我得到了 {follow-connections} 的 object 数组:

[
    {
        follow_er:1,
        follow_ed:2
    },
    {
        follow_er:1,
        follow_ed:3
    },
    {
        follow_er:3,
        follow_ed:1
    },
]

我无法遍历数组。据我所知,我必须通过 follow_er 或 follow_ed,这是一个 user_id 以获得用户 object.

我错过了什么?也许我试图从错误的方向解决它。如果有人可以帮助我解决这个问题,或者只是告诉我一些我必须寻找的关键字或概念,那就太好了。谢谢!

我建议按以下格式为此结构创建自关系:

model User {
  id          Int      @id @default(autoincrement())
  name        String?
  followedBy  User[]   @relation("UserFollows", references: [id])
  following   User[]   @relation("UserFollows", references: [id])
}

然后查询如下:

await prisma.user.findUnique({
        where: { id: 1 },
        include: { followedBy: true, following: true },
})

所以你会得到这样的回复: