如何在返回相同查询响应的字段上过滤GraphQL嵌套数组?或者如何在多个字段上创建GraphQL关系?

时间:2019-06-17 08:30:50

标签: android postgresql graphql apollo hasura

所以我在Android应用程序中将GraphQL与Hasura和Apollo结合使用。该应用程序与运动有关,它在比赛的多个部分中存储每个球员的多个得分集。我的Postgres数据库具有以下表格(带有相关字段):

Match (id, other_fields...)
Segment (id, match_id, other_fields...)
Segment_Player (id, segment_id, match_id)
Player (id, other_fields...)
Score (id, segment_id, player_id, other_fields...)

Segment_PlayerSegmentPlayer表之间的多对多桥接表。从MatchSegment,从PlayerScore有数组关系。

我想查询比赛中每个球员的得分,这些得分以段分开。我想要的响应应类似于以下结构:

Match
--Segment
----Player
------Score

我面临的问题是我找不到在PlayerIdSegmentId上都过滤分数的方法。 Player-Score的关系可以给我该球员的所有分数。或者,我可以在SegmentScore之间创建一个关系,这将为我提供该细分市场中每个玩家的得分。但是,这些方法中的任一个仍然会让我在客户端进行过滤。

我想要的是能够提供响应中返回的数据作为如下where子句中的参数:

query PointsQuery($matchId: String!) {
  SegmentQL: segment(where: {matchId: {_eq: $matchId}}) {
    SegmentId: id
    segment_player {
      player {
        ...PlayerQL
        scores(where: {segmentId: {_eq: SegmentId}}) {
          ...ScoreQL
        }
      }
    }
  }
}

如何在不过滤客户端数据的情况下实现这一目标。

1 个答案:

答案 0 :(得分:0)

我知道这太迟了,但是查询将按原样工作,而没有第二个where子句

query PointsQuery($matchId: String!) {
  SegmentQL: segment(where: {matchId: {_eq: $matchId}}) {
    SegmentId: id
    segment_player {
      player {
        ...PlayerQL
        scores {
          ...ScoreQL
        }
      }
    }
  }
}

因为您只会获得与该细分市场相关的玩家,然后才只会获得与该细分市场相关的玩家的分数。

如果分数实际上与某个细分相关,并且您想要该细分的所有分数,而不是与该玩家与该细分相关的所有分数,则应该添加其他关系

query PointsQuery($matchId: String!) {
  SegmentQL: segment(where: {matchId: {_eq: $matchId}}) {
    SegmentId: id
    score {
      ...ScoreQL
    }
    segment_player {
      player {
        ...PlayerQL
      }
    }
  }
}