Как отфильтровать вложенный массив GraphQL по полю, возвращающемуся в ответе того же запроса? Или как создать отношения GraphQL на нескольких полях? - PullRequest
3 голосов
/ 17 июня 2019

Так что я использую GraphQL с Hasura и Apollo в своем приложении для Android.Приложение связано со спортом, оно хранит множество наборов очков каждого игрока в нескольких сегментах матча.Моя база данных 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_Player - это таблица много-много мостов между Segment и Player таблицами.Существуют отношения массива от Match до Segment и от Player до Score.

Я хочу запросить оценки каждого игрока в матче, разделенном сегментами.Ответ, который я хочу получить, должен выглядеть следующим образом:

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

Проблема, с которой я сталкиваюсь, заключается в том, что я не могу найти способ отфильтровать оценки как по PlayerId, так и по SegmentId.Player - Score отношение может дать мне все очки этого игрока.Или я могу создать отношение между Segment и Score, которое даст мне очки каждого игрока в этом сегменте.Но любой из них все равно оставит мне возможность выполнять фильтрацию на стороне клиента.

Я хочу предоставить возможность возвращать данные в ответ в качестве аргумента в предложении where, как показано ниже:

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

Как этого добиться без фильтрации данных на стороне клиента.

...