如何使用@ResolveField 在 nestjs/graphql 中创建多级嵌套查询?
How to create multilevel nested queries in nestjs/graphql using @ResolveField?
您好。我不知道如何使用@ResolveFiled 创建多级嵌套查询。我希望得到你的帮助。
我在做什么和上下文:
我有产品。该产品有一个供应商。特定于供应商的产品包含产品变型。变体包含选项。
我需要分4个级别提出要求:
- 产品
- ProductHasProvider
- 产品变体
- 变体选项
我使用“代码优先”方法,为每个实体创建了一个 ObjectType。接下来,我创建一个“产品”解析器。
使用@ResolveField 创建二级“ProductHasProvider”
添加 ResolveField(“Providers”)时 - 它出现在主解析器“Product”中并解析 Providers ObjectType。好的,可以了,我可以正确地在2级请求了
@ResolveField('Providers', () => [ProductHasProvider])
async getProductProviders (@Parent() product: Product) {
const { id } = product;
return await this.productListService.ProductsProviders( { id });
}
- 我想在 ProductHasProvider 有变体的地方制作第三层。我把 ProductHasProvider 装饰成父类。
@ResolveField(('variants'), type => [Variant])
async getVariants (@Parent() productHasProvider: ProductHasProvider) {
const { id } = productHasProvider;
return await this.productListService.getVariants({ id });
}
在本例中,此 ResolveField 为 [Variants] 定义了 ObjectType,但出于某种原因在第一级。即在Apollo studio中,该字段显示在“Product”中。我无法查询 ProductHasProvider 的变体。
query Products {
getProducts {
Providers {
id
}
variants {
id
options {
id
}
}
}
}
预期行为:
我添加了一个新的@ResolveField(() => [Variants]) 和“ProductHasProvider”父级(它已经是产品的@ResorveField)。我可以进行第 3 级和第 4 级查询。
query Products {
getProducts {
id
Providers {
id
variants {
id
options {
id
}
}
}
}
}
请告诉我我做错了什么以及如何实现我想要的。谢谢。
@ResolveField
被放在一个 Resolver
中,以指定如何 return 特定实体的特定字段。
在您的例子中,您有 Products 的 Resolver
,其中您为字段 Providers[指定了 @ResolveField
=34=].
我猜你在同一个 Resolver
中添加了另一个 @ResolveField
,它将指定如何 return Products[= 的另一个字段34=].
您想要的是为 Providers 创建另一个 Resolver
,在其中指定如何 return 字段 variants .
以下是我的工作方式:
@Resolver('Product')
export class ProductsResolver {
@ResolveField('Providers', () => [ProductHasProvider])
async getProductProviders (@Parent() product: Product) {
const { id } = product;
return await this.productListService.ProductsProviders( { id });
}
}
@Resolver('Provider')
export class ProvidersResolver {
@ResolveField('variants', () => [Variant])
async getProductProviders (@Parent() provider: ProductHasProvider) {
const { id } = provider;
return await this.variantsService.getVariantForProvider( { id });
}
}
您好。我不知道如何使用@ResolveFiled 创建多级嵌套查询。我希望得到你的帮助。
我在做什么和上下文:
我有产品。该产品有一个供应商。特定于供应商的产品包含产品变型。变体包含选项。
我需要分4个级别提出要求:
- 产品
- ProductHasProvider
- 产品变体
- 变体选项
我使用“代码优先”方法,为每个实体创建了一个 ObjectType。接下来,我创建一个“产品”解析器。
使用@ResolveField 创建二级“ProductHasProvider”
添加 ResolveField(“Providers”)时 - 它出现在主解析器“Product”中并解析 Providers ObjectType。好的,可以了,我可以正确地在2级请求了
@ResolveField('Providers', () => [ProductHasProvider])
async getProductProviders (@Parent() product: Product) {
const { id } = product;
return await this.productListService.ProductsProviders( { id });
}
- 我想在 ProductHasProvider 有变体的地方制作第三层。我把 ProductHasProvider 装饰成父类。
@ResolveField(('variants'), type => [Variant])
async getVariants (@Parent() productHasProvider: ProductHasProvider) {
const { id } = productHasProvider;
return await this.productListService.getVariants({ id });
}
在本例中,此 ResolveField 为 [Variants] 定义了 ObjectType,但出于某种原因在第一级。即在Apollo studio中,该字段显示在“Product”中。我无法查询 ProductHasProvider 的变体。
query Products {
getProducts {
Providers {
id
}
variants {
id
options {
id
}
}
}
}
预期行为:
我添加了一个新的@ResolveField(() => [Variants]) 和“ProductHasProvider”父级(它已经是产品的@ResorveField)。我可以进行第 3 级和第 4 级查询。
query Products {
getProducts {
id
Providers {
id
variants {
id
options {
id
}
}
}
}
}
请告诉我我做错了什么以及如何实现我想要的。谢谢。
@ResolveField
被放在一个 Resolver
中,以指定如何 return 特定实体的特定字段。
在您的例子中,您有 Products 的 Resolver
,其中您为字段 Providers[指定了 @ResolveField
=34=].
我猜你在同一个 Resolver
中添加了另一个 @ResolveField
,它将指定如何 return Products[= 的另一个字段34=].
您想要的是为 Providers 创建另一个 Resolver
,在其中指定如何 return 字段 variants .
以下是我的工作方式:
@Resolver('Product')
export class ProductsResolver {
@ResolveField('Providers', () => [ProductHasProvider])
async getProductProviders (@Parent() product: Product) {
const { id } = product;
return await this.productListService.ProductsProviders( { id });
}
}
@Resolver('Provider')
export class ProvidersResolver {
@ResolveField('variants', () => [Variant])
async getProductProviders (@Parent() provider: ProductHasProvider) {
const { id } = provider;
return await this.variantsService.getVariantForProvider( { id });
}
}