例如,我有这种类型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/