Как запрашивать реляционные данные с помощью GraphQL, Firebase и Gatsby - PullRequest
0 голосов
/ 27 сентября 2018

Я создаю Gatsby.js сайт.

Сайт использует плагин gatsby-source-firestore для подключения к источнику данных Firestore .

Мой вопрос такой.Как я могу запросить реляционные данные?Как, например, выборка данных из двух моделей одновременно, где modelA [x] = modelB [y]

Я не очень понимаю распознаватели.Я не думаю, у меня есть.

Обратите внимание, я не рассматриваю graph.cool в настоящее время.Я хотел бы придерживаться Firebase.Я сделаю сопоставление реляционных данных в чистом JS, если нужно (не GraphQL).

Вот как выглядит мой gatsby-config.js :

{
  resolve: 'gatsby-source-firestore',
  options: {
    credential: require('./firebase-key.json'),
    databaseURL: 'https://testblahblah.firebaseio.com',
    types: [
      {
        type: 'Users',
        collection: 'users',
        map: user => ({
          firstName: user.firstName,
          lastName: user.lastName,
          email: user.email,
          ownsHat: user.ownsHat,
          hatId: user.hatId
        })
      },
      {
        type: 'Hats',
        collection: 'hats',
        map: hat => ({
            hatType: hat.hatType,
            hatUserId: hat.hatUserId,
            hatId: hat.hatId
        })
      }
    ]
  }
},

Это включает две плоские модели данных.Я могу сделать запрос на странице:

any-page.js

export const query = graphql`
  query {
    allUsers {
      edges {
        node {
          ...UserFragment
        }
      }
    }
  }
`

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

export const query = graphql`
  query {
    allUsers {
      edges {
        node {
          ...UserFragment {
              hats (user.userId == hat.userId){
                  type
                  hatId
              }
          }
        }
      }
    }
  }
`

Как вы понимаете, это составляет: Как выполнять несколько запросов GraphQL к реляционным данным.

Учитывая характер плоского JSON в Firestore, это усложняет реляционный аспект GraphQL.

Я действительно хочу лучше понять это и был бы очень признателен за то, чтобы указывать правильный путь.

Я действительно заинтересован в использовании GraphQL и Firebase.

Спасибо!

1 Ответ

0 голосов
/ 27 сентября 2018

Я не уверен, что это работает в graphql, но в Gatsby вы можете использовать gatsby-node, чтобы создавать и изменять ваши узлы и вводить hats в каждый user узел.Вот пример кода, который я использую для добавления авторов в узел Post:

const mapAuthorsToPostNode = (node, getNodes) => {
    const author = getPostAuthorNode(node, getNodes);
    if (author) node.authors___NODES = [author.id];
};

exports.sourceNodes = ({actions, getNodes, getNode}) => {
    const {createNodeField} = actions;

    getCollectionNodes('posts', getNodes).forEach(node => {
        mapAuthorsToPostNode(node, getNodes);
    });
};

Это один из способов сделать это, если записи не в огромных количествах.Если это так, вы должны создать страницу hats для отображения пользовательских шляп, где вы запрашиваете только те шляпы, отфильтрованные по идентификатору пользователя, который получен через параметр paceContext, такой как идентификатор пользователя.

export const pageQuery = graphql`
    query($userId: String) {
        hats: allHats(
            filter: {
                userId: {eq: $userId}
            }
        ) {
            edges {
                node {
                    ...hatFragment
                }
            }
        }
    }
`;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...