Я создаю приложение для реагирования с бэкэндом на GraphCMS (которое использует GraphQL для запроса к базам данных). По сути, у меня есть страница, на которой мне нужно запрашивать элементы из 3 разных таблиц, но только там, где их тип элемента соответствует предоставленному типу.
Типы для каждой таблицы указаны как 3 разных перечисления.
Здесь я вызываю метод для запроса API:
graphCMSClient
.request(query, { articleType: params.extendedContentCategory, reportType: params.extendedContentCategory, videoType: params.extendedContentCategory })
.then((data) => {
this.setState({
data: [...data.reports, ...data.articles, ...data.videos],
})
})
Мой запрос graphQL (представленный переменной query
выше) выглядит следующим образом:
query getData($articleType: ArticleType, $reportType: ReportType, $videoType: VideoType){
reports(where: {reportType: $reportType, featured: true}, orderBy: releaseDate_DESC, first: 5) {
id
... other fields
}
articles(where: {articleType: $articleType, featured: true}, orderBy: releaseDate_DESC, first: 5) {
id
... other fields
}
videos(where: {videoType: $videoType, featured: true}, orderBy: releaseDate_DESC) {
id
... other fields
}
}
ArticleType
, ReportType
и VideoType
- это 3 разных перечисления.
Причина, по которой один и тот же param
передается всем 3 переменным, заключается в том, что эта страница может содержать любые / все эти типы данных - У меня также нет возможности заранее узнать, запрашивает ли пользователь статью, видео, отчет или любую их комбинацию. Более того, есть некоторые типы, которые присутствуют во всех этих 3 - например, ArticleType
, ReportType
и VideoType
все имеют в них значение Economy
.
Однако я сохраняю получение этой ошибки: Error: variable 'reportType' with 'Thoughts_Opinions' is not a valid 'ReportType'
- это имеет смысл, поскольку тип Thoughts_Opinions
находится только в перечислении ArticleType
.
Можно ли как-нибудь написать этот запрос? Например, в этом запросе я могу проверить, существует ли значение в перечислении, а затем условно передать его как переменную? Или мне понадобится отдельный запрос, чтобы проверить это в моем коде и изменить запрос на основе этого?