graphql, использующий вложенные параметры запроса для родительских или родительских параметров для вложенного запроса - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть товар и товары

Товар:

{
  id: Int
  style_id: Int
  items: [items]
}

Товары:

{
  id: Int
  product_id: Int
  size: String
}

Я хочу запросить товары, но получаю только те товары, которые имеютэлемент с размером.

Таким образом, запрос может выглядеть следующим образом:

products(size: ["S","M"]) {
  id
  style_id
  items(size: ["S","M"]) {
    id
    size
  }
}

Но, похоже, должен быть способ, которым я могу просто сделать

products {
  id
  style_id
  items(size: ["S","M"]) {
    id
    size
  }
}

И в распознавателе для продуктов я могу взять аргументы из вложенного запроса и использовать их.В этом случае добавьте чек, чтобы вернуть только те товары, которые имеют эти размеры.Таким образом, я получаю верный верхний уровень с правильной нумерацией страниц вместо множества пустых продуктов.

Возможно ли это или, по крайней мере, выполняется наоборот:

products(size: ["S","M"]) {
  id
  style_id
  items {
    id
    size
  }
}

И отправка размерааргумент вплоть до решателя предметов?Единственный способ, которым я знаю, будет через контекст, но в одном месте я нашел это, они сказали, что это не очень хорошая идея, потому что контекст охватывает полный запрос на всех глубинах.

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Я согласен с ответом @ DenisCappelini.Если возможно, вы можете создать новый тип, представляющий только продукты, имеющие элемент.

Однако, если вы не хотите этого делать или просто интересуетесь тем, какСелектор уровня может знать об аргументах дочерних селекторов, вот способ сделать это:

Есть 2 способа сделать это.


Для этого:

products {
  id
  style_id
  items(size: ["S","M"]) {
    id
    size
  }
}

В graphql распознаватели имеют такую ​​подпись:

(obj, args, context, info) => {}

Четвёртый аргумент info содержит информацию обо всем запросе.А именно, он знает об аргументах дочерних селекторов.

Используйте этот пакет или аналогичный, потому что есть другие, для анализа информации для вас: https://www.npmjs.com/package/graphql-parse-resolve-info


ВышеЭто довольно много работы, так что если вы хотите сделать это вместо:

products(size: ["S","M"]) {
  id
  style_id
  items {
    id
    size
  }
}

Затем в вашем преобразователе для products, вам также нужно вернуть size.Предположим, это ваш распознаватель для products:

(parent, args) => {
  ...
  return {
    id: '',
    style_id: ''
  }
}

Измените преобразователь так, чтобы он также возвращал размер, подобный следующему:

(parent, args) => {
  ...
  return {
    id: '',
    style_id: '',
    size: ["S", "M"]
  }
}

Теперь в вашем разрешении для products.items у вас будетдоступ к size, вот так:

(product, args) => {
  const size = product.size
}
0 голосов
/ 07 декабря 2018

IMO у вас должно быть ProductFilterInputType, которое представлено GraphQLList(GraphQLString), и этот преобразователь фильтрует products на основе этого списка.

import { GraphQLList, GraphQLString } from 'graphql';

const ProductFilterInputType = new GraphQLInputObjectType({
  name: 'ProductFilter',
  fields: () => ({
    size: {
      type: GraphQLList(GraphQLString),
      description: 'list of sizes',
    }
  }),
});

Надеюсь, это поможет:)

...