Можно ли создать подзапрос GraphQL для создания массива как элемента markdownRemark?

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

Когда я захожу на веб-страницу языка, я бы хотел получить общую информацию из коллекции language_pages и массива schedule_items с тем же значением в поле language, но я как бы чешу затылок, пытаясь понять, как сделай это.

Каждая из 2 коллекций включает поле templateKey, которое различает коллекции. Значения: language-post для общей языковой информации и schedule-item для элементов расписания.

Мой основной запрос на получение одноязычной страницы следующий:

query {
 markdownRemark(frontmatter: { language: { eq: "Niemiecki" }}) {
  html
    frontmatter {
      language
      description
    }
  }
}

Язык поля также существует в коллекции элементов расписания, поэтому я думаю, что мне следует как-то использовать его для фильтрации по коллекции. Я полный noob graphQL, однако, я действительно не нашел и примера того, что я пытаюсь сделать здесь, что делается. Моя полная работа с боджем привела к примерно следующему:

 query {
  markdownRemark(frontmatter: { language: { eq: "Niemiecki" }}) {
    html
    frontmatter {
      language
      description

    }
    children {
      id
      group
      room
      time
    }
  }
}

Что даже не выполняется должным образом, и я, честно говоря, не знаю, как заставить его работать.


person Kuba Chmiel    schedule 26.03.2019    source источник
comment
Итак, у вас есть 2 папки для каждой коллекции, и они обе имеют уценку, и каждая имеет language в качестве поля в frontmatter?   -  person Derek Nguyen    schedule 27.03.2019
comment
* папка для каждой коллекции   -  person Derek Nguyen    schedule 27.03.2019
comment
В каждой коллекции есть папка, страницы с разметкой и поле языка во фронтальной части, правильно.   -  person Kuba Chmiel    schedule 27.03.2019


Ответы (1)


Вы можете выполнить 2 запроса бок о бок и фильтровать по имени папки с помощью регулярного выражения:

query LanguageInfo($lang: String) {
  languagePage: markdownRemark(
    frontmatter: { language: { eq: $lang }},
    fileAbsolutePath: {
        regex: "/your-language-folder-name/"
      }
  ) {
    frontmatter { ... }
  }

  scheduledItem: markdownRemark(
    frontmatter: { language: { eq: $lang }},
    fileAbsolutePath: {
        regex: "/your-schedule-folder-name/"
      }
  ) {
    frontmatter { ... }
  }
}
  • lang может быть переменной, которую вы передаете в действие createPage при программном создании страницы. Затем вы можете использовать его в запросе шаблона страницы. Пример из документа на случай, если он вам понадобится:
createPage({
  path: `/my-sweet-new-page/`,
  component: path.resolve(`./src/templates/my-sweet-new-page.js`),
  // The context is passed as props to the component as well
  // as into the component's GraphQL query.
  context: {
    lang: `english`,
  },
})
  • languagePage & scheduledItem - это псевдонимы, которые упрощают получение ваших данных. Вы можете получить доступ к таким данным, как data.languagePage... & data.scheduledItem...

Сообщите мне, если это поможет.

person Derek Nguyen    schedule 27.03.2019
comment
Я думаю, что этот запрос делает то, что я ищу, просто нужно настроить остальную часть моего кода, чтобы она соответствовала ему :) Большое спасибо. - person Kuba Chmiel; 27.03.2019
comment
Теперь я могу подтвердить, что все сработало так, как задумано. Еще раз большое спасибо. - person Kuba Chmiel; 27.03.2019
comment
Есть ли публичное репозиторий на github, чтобы узнать, как вы его решили? - person muescha; 03.04.2019
comment
Нет, извините, я работал над коммерческим проектом, когда столкнулся с этой проблемой. Код находится в частном репо. Однако, если у вас есть другие вопросы, я буду рад помочь - person Kuba Chmiel; 18.05.2019