使用依赖于其他节点的字段的惯用 graphql 方法是什么



例如,我有这种类型Product

type Product {
id: ID!
name: String!
}
type Query {
products(ids: [ID!]!): [Product!]!
}

我需要有一个字段quality: Int!但此字段的值取决于数组中的其他产品。所以在查询中

products(ids: [1,2])

products(ids: [2,3])

产品 2 将具有不同的quality值。

我应该将其添加到"产品"类型中吗?

type Product {
id: ID!
name: String!
quality: Int!
}

这感觉很奇怪,并且可能会与某些 cliend 缓存发生冲突quality因为它不是一个产品的属性,而是一组产品的属性。 解决这个问题的惯用方法是什么?

质量不是一种产品的属性,而是一组产品的属性

这意味着您应该有一个类型来表示一组产品和此属性。例如:

type ProductGroup {
products : [Product!]
qualify  : Int!
}

查询变为:

type Query {
productGroup(ids: [ID!]!) : ProductGroup
}

ProductGroup只是展示这个想法的一个例子。您可以选择其他名称,以便从域模型的角度更好地描述此概念。

大多数GraphQL库(如 Apollo)都允许用户为某些类型指定自定义键。这可用于防止缓存无效值。

import { InMemoryCache, defaultDataIdFromObject } from 'apollo-cache-inmemory';
const cache = new InMemoryCache({
dataIdFromObject: object => {
const defaultId = defaultDataIdFromObject(object); // Assumes the id field
switch (object.__typename) {
case 'Product': return `${defaultId}:${object.quality}`; // Combines the id field with the quality
default: return defaultId;
}
}
});

阅读有关缓存 GraphQL 结果的更多信息:https://www.apollographql.com/docs/react/advanced/caching/

最新更新