Как написать JOIN на graphQL или получить результат из нескольких типов - AWS App Sync iOS

Я использую AWS AppSync для приложения чата в одном из моих приложений. Мы можем успешно выполнить настройку и базовый запрос.

В одном из случаев мне нужно написать индивидуальный запрос GraphQL, чтобы я мог иметь дополнительные данные, используя ссылку одного типа из другого. Например, я могу получить allMessageGroup от пользователя, а также allMessages от определенной группы.

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

Но я не могу понять, как сделать JOIN или написать такой запрос, который дает смешанные результаты на основе Conversation / Message / User types / table.

Платформа: iOS Язык: Swift

Подробности ниже - это моя схема и API / запрос, которые я использую.

Схема

type Conversation {
  conversation_cover_pic: String
  conversation_type: String!
  createdAt: String
  id: ID!
  messages(after: String, first: Int): MessageConnection
  name: String!
  privacy: String
}
type Message {
  author: User
  content: String!
  conversationId: ID!
  createdAt: String
  id: ID!
  recipient: User
  sender: String
}
type MessageConnection {
  messages: [Message]
  nextToken: String
}

Запрос

query getUserConversationConnectionThroughUser($after: String, $first: Int)
{
    me
    {
        id
        __typename
        conversations(first: $first, after: $after)
        {
            __typename
            nextToken
            userConversations
            {
                __typename
                userId
                conversationId
                associated
                {
                    __typename
                    userId
                }
                conversation
                {
                    __typename
                    id
                    name
                    privacy
                    messages
                    {
                        __typename
                        id
                        conversationId
                        content
                        createdAt
                        sender
                        isSent
                    }
                }
            }
        }
    }
}

Я хочу помочь, но это почти неразборчиво. Вы хотите сказать, что хотите вернуть больше, чем просто me из вашего запроса? СОЕДИНЕНИЯ не обрабатываются GraphQL, это могут обрабатывать преобразователи.

None of your Beez Wax 02.01.2019 21:18

Я хочу получить результат больше, чем я, он может быть основан на условном, например, получить список всех чат-групп, а также добавить последнее сообщение в группу с подробностями группы, которые доступны в разговоре / группе весь список сообщений

Tarun Seera 03.01.2019 14:57

Можете показать свои резолверы? Graphql - это просто способ определения границ и типов. Он не говорит, как запрашивать или хранить данные.

None of your Beez Wax 03.01.2019 15:05

Вы поняли это? Я столкнулся с той же проблемой: я могу получить объект me в запросе iOS, а затем во всех userConversations, но я не могу пройти через userConversations, чтобы найти все фактические разговоры.

Munib 08.01.2019 00:14
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
1 580
1

Ответы 1

Похоже, вам нужно несколько запросов к одному или нескольким источникам данных для выполнения этого запроса graphQL. В этом случае вы можете использовать функцию AppSync преобразователь конвейера.

С помощью преобразователи трубопроводов вы можете создать несколько функции, каждый из которых может использовать результаты предыдущей функции и запрашивать базу данных. Эти функции выполняются в указанном вами порядке.

Пример того, что вы могли бы сделать с преобразователем конвейера:

  1. Одна функция будет запрашивать базу данных чат-группы
  2. Вторая функция будет использовать результаты чат-группы для получения сообщений.
  3. Объедините все результаты в один ответ graphQL, содержащий информацию о группе и сообщения

Вот документация для преобразователи конвейера:https://docs.aws.amazon.com/appsync/latest/devguide/pipeline-resolvers.html

Нет необходимости использовать конвейерные преобразователи, этот запрос используется в качестве примера в приложении чата appsync, которое также не использует конвейерные преобразователи. Пример

Munib 08.01.2019 00:12

Другой способ запроса нескольких источников данных - установка вложенных преобразователей. Это метод, используемый приложением чата.

Michael Willingham 09.01.2019 01:04

Спасибо за ответ. В этом есть смысл, если бы я мог быстро воспроизвести тот же запрос из приложения чата, как это можно было бы сделать? Это проблема, с которой я столкнулся, здесь.

Munib 09.01.2019 07:52

Вы добавляете 1) преобразователь в сам запрос, 2) преобразователь в подполя типа возвращаемого запроса. В вашем примере есть преобразователь для запроса «я». Запрос «я» возвращает тип «Пользователь», и есть несколько преобразователей для полей типа «Пользователь». Следовательно, когда вы запускаете запрос «я», преобразователь «я» будет работать первым, а затем преобразователь «User.conversations» будет запускаться вторым, с вводом от преобразователя «я». Вот резолверы, используемые в этом примере: Резольверы

Michael Willingham 09.01.2019 23:24

Я полностью понимаю, но когда я генерирую код с помощью ampify для swift, он почему-то не генерирует поля для associated: [UserConversations]. Таким образом, даже несмотря на то, что мои преобразователи настроены точно так же, как приложение чата, на типе UserConversations в первую очередь нет подполя, к которому нужно было бы получить доступ. Здесь - это генерация кода для Swift, о котором я говорю. Как видите, нет возможности связаться со мной через UserConversations.

Munib 10.01.2019 02:34

У меня есть установочные преобразователи на UserConversations, но я не могу связаться с ними в быстром коде. Это проблема.

Munib 12.01.2019 22:01

Другие вопросы по теме