0

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

用户 A 喜欢用户 B 用户 B 匹配用户 B 现在用户 A 和用户 B 可以开始互相聊天了。

我还跟踪谁访问了每个配置文件用户 A 由用户 B 访问 用户 A 由用户 C 访问

在应用程序中,我输入了运行应用程序的用户的详细信息。我有一个看起来像这样的 me 查询:

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,因此如果该关系在多个地方重复,这将是一个问题。

我真的很感激任何帮助,因为我没有想法。

提前致谢。

4

2 回答 2

0

在 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
      }
    }
  }
}

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

于 2020-09-21T16:32:06.393 回答
0

您在评论中澄清:

在搜索查询中列出用户时,我需要能够知道我和用户之间的关系

也就是说,您正在尝试询问某个用户

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 连接表的内容,则可以查询该表以填写此字段(如果需要)。

于 2020-09-21T19:22:30.050 回答