GraphQL:过滤数组中的数据

gCa*_*nal 9 graphql graphcool

我确定这是一件很简单的事情,但我在GraphQL的doc或Graphcool中找不到任何东西.

假设我有一个具有此架构的实体(新的GraphQL用户,抱歉,如果我在架构表示中出错):

Book {
  name: String!
  author: String!
  categories: [String!]
}
Run Code Online (Sandbox Code Playgroud)

如何查询属于该"mystery"类别的所有书籍?我知道我可以过滤allBooks(filter: {}),但categories_in: ["mystery"]categories_contains: "mystery"没有做到这一点.

mar*_*ani 10

Category 模型

想一想这种情况,创建Category模型绝对是可行的方法.

例如,假设您希望以后允许读者订阅他们喜欢的类别.或者,如果您想要所有现有类别的列表,该怎么办?使用字符串列表,您需要查询所有书籍,并以某种方式对所有获得的类别进行后处理.在模型级别上处理它而不是使用字符串列表感觉更自然.

相反,您可以创建一个新Category模型并在Category和之间添加多对多关系Book.在这种情况下,我想添加一个唯一的枚举字段tag和一个字符串字段text.(一个独特的字符串字段tag也适用,可能是品味问题.)

通过此设置,您可以轻松满足数据要求

哪些书被分配到给定的类别?

query {
  # query books by unique category tag
  Category(tag: MYSTERY) {
    books {
      id
    }
  }
  # query books by specific category text
  Category(filter: {
    text: "mystery"
  }) {
    books {
      id
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

哪些书分配给给定列表的至少一个类别?

query {
  allCategories(filter: {
    OR: [{
      tag: MYSTERY
    }, {
      tag: MAGIC
    }]
  }) {
    books {
      id
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

哪些书分配给给定列表的所有类别?

query {
  allCategories(filter: {
    AND: [{
      tag: MYSTERY
    }, {
      tag: MAGIC
    }]
  }) {
    books {
      id
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

相关过滤器

即使上述查询满足指定的数据要求,书籍也会Category在响应中进行分组,这意味着我们必须在客户端上展平这些组.

通过所谓的相关过滤器,我们可以将其转换为仅根据定义其相关类别的条件获取书籍.

例如,要查询分配给给定列表的至少一个类别的书籍:

query {
  allBooks(filter: {
    OR: [{
      categories_some: {
        tag: MYSTERY
      },
      categories_some: {
        tag: MAGIC
      }
    }]
  }) {
    id
  }
}
Run Code Online (Sandbox Code Playgroud)