#graphql #gatsby
#graphql #gatsby
Вопрос:
Я создаю веб-страницу для языковой школы и сейчас пытаюсь создать страницы о языках, которые там преподаются. Предполагается, что они должны включать название языка, краткое описание и список связанных с ними элементов расписания. В Netlify CMS я создал для них 2 коллекции. Один из них содержит общую информацию о языке, а другой включает элементы расписания.
Что я хотел бы сделать, когда захожу на веб-страницу языка, так это получить общую информацию из language_pages
коллекции и массив schedule_items
с тем же значением в language
поле, но я немного ломаю голову, пытаясь понять, как это сделать.
Каждая из двух коллекций включает в себя templateKey
поле, которое различает коллекции. Значения указаны language-post
для общей информации о языке и schedule-item
для элементов расписания.
Мой основной запрос для получения страницы на одном языке следующий:
query {
markdownRemark(frontmatter: { language: { eq: "Niemiecki" }}) {
html
frontmatter {
language
description
}
}
}
Язык полей также существует в коллекции элементов расписания, поэтому я думаю, что мне следует каким-то образом использовать его для фильтрации по коллекции. Однако я полный новичок в GraphQL, и я действительно не нашел и пример того, что я пытаюсь сделать здесь, выполняется. Результатом моей полной работы с кузовом стало что-то вроде этого:
query {
markdownRemark(frontmatter: { language: { eq: "Niemiecki" }}) {
html
frontmatter {
language
description
}
children {
id
group
room
time
}
}
}
Который даже не выполняется должным образом, и, честно говоря, у меня нет идей, как я мог бы заставить его работать.
Комментарии:
1. итак, у вас есть 2 папки для каждой коллекции, и обе они markdown, и каждая имеет
language
значение поля вfrontmatter
?2. * папка для каждой коллекции
3. У каждой коллекции есть папка, страницы включения markown и языковое поле во внешнем интерфейсе, правильно.
Ответ №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
amp;scheduledItem
— это псевдоним, который упрощает извлечение ваших данных. Вы можете получить доступ к данным следующим образомdata.languagePage...
amp;data.scheduledItem...
Дайте мне знать, если это поможет.
Комментарии:
1. Я думаю, что этот запрос делает то, что я ищу, просто нужно подогнать остальную часть моего кода под него 🙂 Большое вам спасибо.
2. Теперь я могу подтвердить, что это сработало так, как задумывалось. Еще раз большое вам спасибо.
3. у меня есть общедоступный репозиторий на github, чтобы посмотреть, как вы это решили?
4. Нет, извините, я выполнял коммерческий проект, когда столкнулся с этой проблемой. Код находится в частном репозитории. Однако, если у вас возникнут какие-либо другие вопросы, я буду рад помочь