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

Posted

技术标签:

【中文标题】如何使用 Prisma 和 GraphQL 创建自解析对象类型数组【英文标题】:How to make self resolving array of object types with Prisma and 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 对象。

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

【问题讨论】:

【参考方案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 方法来做到这一点。

以上是关于如何使用 Prisma 和 GraphQL 创建自解析对象类型数组的主要内容,如果未能解决你的问题,请参考以下文章

将自定义 GraphQL 解析器和类型添加到 Prisma/Nexus 架构中

NestJS 中与 GraphQL 的 Prisma 自关系

如何将 GraphQL 查询从 Node.js 发送到 Prisma

PRISMA:如何接收 REST API 发布请求(非 GraphQL)?

Prisma、GraphQL 和 Apollo 中具有突变的数据关系和连接类型

如何使用 prisma (graphql) 集群