【问题标题】:Nested Query GraphQl嵌套查询 GraphQl
【发布时间】:2021-01-29 11:42:43
【问题描述】:

我是使用 graphql 的新手,我想知道如何过滤我的查询以获取在我的输入数组中包含一些成分对象的食谱。

这是 schema.gql 文件

type Recipe {
  id: Int
  title: String!
  author: String
  link: String
  category: String
  subcategory:String
  ingredients:[Ingredients]
}

type Ingredients{
    id:Int
    name:String!
    quantity:Float!
    measure:String
    observation:String
  }

type Query {
  recipe: [Recipe]
  ingredient:[Ingredients]
}

此配方架构有 1 个相应的服务

const db = require('../db')

class RecipeService{
  //PENDENTE FINALIZAR ESSA SERVICE
  async getRecipeByIngredient(ingredient)
}

以及相应的查询解析器

 Recipe: {
    async ingredients(recipe, _, { dataSources }) {
      return await dataSources.IngredientService.getRecipeIngredients(recipe.id)
    },
  },
  Query: {
    recipe: async () => db('Recipe'),
    ingredient: async () => db('Ingredient'),
  }

这里的主要想法只是有一个过滤器,可以看到哪些食谱有一些成分,用户将通过 APP 告知。

我得到了包含数据库中所有食谱的“食谱”查询,但我需要一个查询来获取这些食谱并使用字段成分进行过滤,例如:

  1. 配方 - 糖蛋糕,配料:糖、蜂蜜、四...
  2. 食谱 - 天鹅绒蛋糕的配料:糖、香草……

如果用户通知 Sugar,API 应该返回这 2 个食谱,但如果用户通知 Sugar、Honey 和 Four,API 将只返回选项 1。

谁能帮帮我?

非常感谢。

【问题讨论】:

  • 过滤是一个解析器角色... f.e.对于query recipes( where: { contains: ['Sugar', 'Vanilla'] } ) { ...请参阅文档/tuts 如何使用简单和复杂的参数/变量...稍后您可以引入 AND/OR 选项

标签: javascript reactjs graphql apollo-server


【解决方案1】:

我有一个解决方案,我想与你分享。

我在解析器上实现的过滤器:

module.exports = {
  Recipe: {
      ingredients(recipe, _, { dataSources }, info) {
        return  dataSources.IngredientService.getRecipeIngredients(recipe.id)
    }
  },
  Query: {
    recipe(obj, {name}, {dataSources}, info) {
      if (name) {
        return dataSources.IngredientService.getIngredientsByName(name)
      } else {
        return db('Recipe')  
      }
    },
    ingredient: async () => db('Ingredient'),
    recipeByIngredient:async () => db('Recipe'),
  }, Mutation: {
    createRecipe: async (_, { data }) => await (await db('Recipe').insert(data).returning('*'))[0],
    updateRecipe: async (_, { data, id }) => await (await db('Recipe').where({ id }).update(data).returning('*'))[0],
    deleteRecipe: async (_, { filter }) => {
      if (filter.id) {
        return await db('Recipe').where({ id: filter.id }).delete()
      }
      if (filter.title) {
        return await db('Recipe').where({ title: filter.title }).delete()
      }
      throw new Error('Should provide the ID or TITLE')
    }
  }
}

使用这个解析器模块,我在“配方”查询解析器上创建了一个新过滤器,它接收成分的“名称”来制作过滤器并将其传递给服务以在数据库中实现过滤器。

感谢您的支持。

【讨论】:

    猜你喜欢
    • 2020-12-02
    • 1970-01-01
    • 2018-06-13
    • 2019-05-30
    • 2021-01-14
    • 2017-06-16
    • 2017-07-17
    • 1970-01-01
    • 2017-01-30
    相关资源
    最近更新 更多