如何在Hasura中建立朋友关系

时间:2020-08-06 21:04:13

标签: hasura

我有2个表:usersfriends

friends具有一个user_id外键,该外键显然映射到users id键。 friends还有一个friend_id键,它也映射到users id键。

我正在使用JWT身份验证。我已经成功地在users表上设置了权限,以便当用户查询用户时,该用户仅提取该特定用户的列。我还为users表上的朋友创建了一个数组关系,因此user行可以通过该关系具有friends

但是,当查询如下内容时:

{
  user {
    username
    friends {
      id
      username
    }
  }
}

这对朋友返回null,因为用户角色无权访问朋友(由于会话变量X-Hasura-User-Id用于按会话确定用户。我如何协调会话变量的工作,但又能够查询其他朋友?

1 个答案:

答案 0 :(得分:1)

将此权限放在friends上,然后用户可以看到friend_id是其user.id的所有朋友行:

{
  "friend_id" :{
    "_eq" : "X-Hasura-User-Id"
   }
}

关系许可是从关系表继承的。因此,您只需要确保用户可以自己定期访问相关的表行,并且如果可以的话,它也将应用于关系。


不相关,看起来这些表具有相同的列。如果它们相同,则可能需要将users-> users中的自引用关系用作friends。如果不忽略此=)


编辑:

尝试使用_exists权限:

(您可以使用直接访问friendsuser的关系来简化此操作,但是我不知道您的确切表和关系结构)

“如果表好友中存在,则'friend_id'为'X-Hasura-User-Id'并且'user_id'等于该行的用户ID的行”

{
  "_or": [
    {
      "_exists": {
        "_table": { "schema": "public", "name": "friends" },
        "_where": {
          "_and": [
            { "friend_id": { "_eq": "X-Hasura-User-Id" } },
            { "user_id": { "_ceq": "user_id" } }
          ]
        }
      }
    },
    { "id": { "_eq": "X-Hasura-User-Id" } }
  ]
}