【问题标题】:How to make self resolving array of object types with Prisma and GraphQL如何使用 Prisma 和 GraphQL 创建自解析对象类型数组
【发布时间】:2021-03-10 03:42:38
【问题描述】:

也许标题不准确,但我真的不知道如何描述它了。我浏览了多个文档和描述,但仍然无法弄清楚。

我想在我的用户类型上实现一个基本的社交媒体,如关注者/关注查询。我正在使用 MySQL,为此我创建了一个名为 Follow 的单独表,因为它是多对多连接。

这是我在数据库中的表的伪表示,没有不必要的列:

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_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")
}

通过实现这一点,我可以将关注者和关注对象附加到用户的根查询:

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} 的对象数组,我也无法让它工作:

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

我无法遍历数组。据我所知,我必须通过 follow_er 或 follow_ed,这是一个 user_id 来获取 User 对象。

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

【问题讨论】:

    标签: graphql prisma


    【解决方案1】:

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

    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 },
    })
    

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

    【讨论】:

    • 感谢您的回复!正如我所写的,我设法获得了跟随关系的对象数组,这些是 FOLLOW 表中的行。我认为一定有一个特殊的函数或我缺少的东西,但我设法通过使用简单的 forEach 循环遍历数组然后使用 .findUnique 方法来做到这一点。
    猜你喜欢
    • 2020-10-18
    • 2019-09-29
    • 2020-11-26
    • 2020-10-04
    • 2019-02-14
    • 2019-12-18
    • 2017-05-23
    • 1970-01-01
    • 2019-06-19
    相关资源
    最近更新 更多