问题描述
我有一个如下查询:
query MyQuery {
products {
edges {
node {
featured
id
image {
altText
mediaItemUrl
slug
}
productId
name
onSale
}
}
}
}
我想要的只是获取featured
字段为true
的结果,如果featured
为false,那么它永远不会显示在结果中。
类似于mysql中以下查询的内容:
SELECT id,image,name,featured FROM products WHERE featured = 'false'
但是在上面的graphql查询中,我无法查询featured = false。
我尝试过:
query MyQuery {
products {
edges {
node {
featured @include(if: false)
id
... other field I need
}
}
}
}
但是此查询的作用是,如果featured
字段为true,则在结果中包括featured
字段,否则不要在结果中包括该字段。这不是我想要的
我想要的是
如果产品的featured
字段为true
,则将products
包含在结果中,否则,从结果中删除整个产品。
如何在上面的MyQuery
中实现这一目标?
解决方法
@include
和@skip
伪指令用于字段选择,而不是过滤。 GraphQL没有内置的过滤,排序或分页方式。每个服务都应通过公开适当的参数来实现这些功能。
在这种情况下,products
可以公开名为filter
或isFeatured
的参数,以增加按featured
值过滤结果的功能。然后,字段的解析器应使用该参数值来确定要返回的正确值。
如果要编写客户端查询并使用未编写的架构,请查看API文档以确定products
字段可用的参数。如果架构没有提供此功能,并且您没有办法更改它,那么作为客户端,您将没有太多选择。充其量,您可以在获取结果后自行处理过滤,但是如果您还使用分页,则会很麻烦。