微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我无法解决的Graphql模式设计问题

如何解决我无法解决的Graphql模式设计问题

我正在尝试为应用程序设计架构,但有一个我无法解决的问题。这是应用程序的详细信息

用户A喜欢用户B 用户B匹配用户B 现在,用户A和用户B可以开始彼此聊天了。

我还跟踪谁访问了每个个人资料 用户A被用户B访问 用户A被用户C访问过

在应用程序中,我让我输入运行该应用程序的用户的详细信息。我有一个如下查询

me {
  id
  name
  email
  ...
  ...
  likes {  ## users who liked me
    nextToken
    edges {
      node { ## user
        id
        name
        ...
      }
    }
  }
  matchs { ## users who matched with me
    nextToken
    edges {
      node { ## user
        id
        name
        ...
        ...
      }
    }
  } 
  Vists { ## users who visited me
    nextToken
    edges {
      node { ## 
        id
        name
        ...
        ...
      }
    }
  }
}

除此之外,我还有listUsers查询,它列出了我附近的用户,看起来像这样:

listUsers {
  nextToken
  total
  edges {
    distance
    node {  ## user
      id
      name
      ...
      ...
    }
  }
}

我的问题 由于用户之间存在关联(LIKED_BY,MATCHED_WITH),因此在我的架构中应使用该关联以便可兑现。请记住,该关系可以在客户端从NO_RELATIONSHIP更改为LIKED_BY到MATCHED_WITH,因此,如果在多个位置重复该关系,将是一个问题。

真的很感谢我的帮助。

谢谢。

解决方法

在GraphQL模式中,通常会像这样对其他对象的显式引用建立链接。

type User {
  id: ID!
  ...
  matches: [User!]  # actual users,not their IDs
  likes: [User!]
  visitedBy: [User!]
}

在顶级Query类型中,您可以返回当前用户

type Query {
  me: User
}

现在,如果我想要拜访我的人的名字和电子邮件地址,我可以找出

query WhoVisitedMe {
  me {
    visitedBy { name,email }
  }
}

例如,您可以遍历此图以获取建议:对于访问您的人来说,他们喜欢谁?

query WhoDoVisitorsLike {
  me {
    visitedBy {
      likes {
        id
        name
      }
    }
  }
}

您的应用程序的解析器代码将需要填写这些对象引用。

,

您在评论中进行了澄清:

在搜索查询中列出用户时,我需要能够了解我与用户之间的关系

也就是说,您正在尝试询问一些用户

type User {
  relationToMe: [RelationshipType!]
}

relationToMe字段可以具有任意数量(包括零)的关系类型;您可以将它们定义为GraphQL枚举

enum RelationshipType {
  LIKES,LIKED_BY,VISITED,VISITED_BY,MATCHES               # bidirectional
}

然后在查询中您可以询问

query FindSomeUsers($input: SearchUsersInput!) {
  searchUsers(input: $input) {
    users {
      id,name,email
      relationToMe
    }
  }
}

并获得类似的回复

{
  "data": {
    "searchUsers": {
      "users": [
        "id": "12345","name": "John Smith","email": "jsmith@example.com","relationToMe": ["VISITED","MATCHES"]
      ]
  }
}

您需要在实现中实现自定义解析器以填充此字段。如果您有类似多对多SQL连接表的表,则可以根据需要查询该表以填写此字段。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。