#graphql
Вопрос:
Извините за вопрос новичка. Я хотел бы отфильтровать вывод вложенных массивов объектов. Вот мой вопрос:
properties {
codes {
id
}
}
и он возвращается:
{
"data": {
"properties": [
{
"codes": [
{
"id": "1"
},
{
"id": "2"
}
]
},
{
"codes": [
{
"id": "3"
},
{
"id": "4"
}
]
}
]
}
}
Я хочу отфильтровать вывод, где id = «1» в свойствах.коды. Итак, новый запрос заключается в следующем:
properties {
codes (id: "1") {
id
}
}
и на выходе по-прежнему остается пустой массив «коды» :
{
"data": {
"properties": [
{
"codes": [
{
"id": "1"
}
]
},
{
"codes": []
}
]
}
}
Как бы я правильно отфильтровал вывод? Мне нужно получить это:
{
"data": {
"properties": [
{
"codes": [
{
"id": "1"
}
]
}
]
}
}
Комментарии:
1.
codes (id: "1")
фильтрует [существующий]codes
контент … похоже, что вам нужно решить ее на более высоком/родительском уровне , напримерproperties( where: { codes: { contains_id: "1"}}}){ codes {...
, или простоproperties( codesId: "1"){ codes {...
, в зависимости от сложности/гибкости фильтрации
Ответ №1:
Вы должны справиться с этим в рамках своей функции решателя. Вы не упомянули свой предпочтительный язык, поэтому я предоставляю простой распознаватель JavaScript/ES6:
// Dummy data
const data = {
properties: [
{
"codes": [
{ "id": "1" },
{ "id": "2" },
{ "id": "3" }
]
},
{
"codes": [
{ "id": "3" },
{ "id": "4" }
]
}
]
}
// grab the id param from the arguments
const resolve = ({ id }) => {
// retrieve the data
const { properties: props } = data
const result = []
// filter data
const properties = props.reduce((acc, cur) => {
const codes = cur.codes.filter(code => code.id === id)
if (codes.length) {
acc.push({ codes })
}
return acc
}, [])
return {
properties
}
}
console.log(resolve({ id: "1" }))
console.log(resolve({ id: "3" }))
Комментарии:
1. это то, что я уже делаю в своей функции распознавания (JavaScript). Я просто подумал, что это можно сделать с помощью самого запроса/переменных
2. GraphQL, распознаватели и т. Д. Ничего не делают, кроме как вызывают какие-либо функции распознавателя и передают аргументы (или возвращают значение null, если такового нет). Там нет никакой «магии» для фильтрации или чего-то еще. Это может быть, если вы используете какой-то фреймворк, который может обрабатывать ваше хранилище данных, но это не относится к GraphQL.