首页 > 解决方案 > 嵌套查询 GraphQl

问题描述

我是使用 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。

有人可以帮我吗?

多谢。

标签: javascriptreactjsgraphqlapollo-server

解决方案


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

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

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')
    }
  }
}

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

感谢您的支持。


推荐阅读