我正在进行一个使用type-graphql和typeorm的项目。我有两个实体:膳食和食材,我希望在这两个实体之间建立许多到许多的关系。
我在我的Meal.ts文件中添加了以下代码:
@Field(() => [Ingredient])
@ManyToMany(() => Ingredient, ingredient => ingredient.meals, { onUpdate: "NO ACTION" })
@JoinTable({ joinColumn: { name: "meal_id" }, inverseJoinColumn: { name: "ingredient_id" } })
ingredients!: Promise<Ingredient[]>以及我的Ingredient.ts文件中的以下代码:
@Field(() => [Meal])
@ManyToMany(() => Meal, meal => meal.ingredients, { onUpdate: "NO ACTION" })
meals!: Promise<Meal[]>此外,我还为我的迁移编写了以下代码:
CREATE TABLE "meal_ingredient" (
"id" uuid NOT NULL DEFAULT uuid_generate_v4() PRIMARY KEY,
"meal_id" uuid NOT NULL,
"ingredient_id" uuid NOT NULL,
FOREIGN KEY ("meal_id") REFERENCES "meal"("id") ON DELETE CASCADE ON UPDATE NO ACTION,
FOREIGN KEY ("ingredient_id") REFERENCES "ingredient"("id") ON DELETE CASCADE ON UPDATE NO ACTION
)我认为这充分建立了我想要的两个实体之间的关系(尽管如果我错了,请告诉我)。我想知道的是,我需要在Resolver文件中添加什么才能将一顿饭和一份配料联系起来?这意味着,如果我有给定的膳食和配料,我如何在解析器中定义一个突变,以便在meal_ingredient表中创建一行,以便以后可以查询该餐的配料或配料的膳食。
发布于 2022-04-06 01:28:29
您需要一个FieldResolver (博士)来查询关系数据,无论是在一对多的关系中还是在多到多的关系中:
@Resolver(() => Ingredient)
class IngredientResolver {
// your other query and mutations
@FieldResolver(() => Meal)
async getMeal(@Root() meal: Meal): Promise<Meal | undefined> {
// Root is equivalent to parent in graphql
return Meal.findOne(meal.id) // use this syntax if your Entity extends BaseEntity
}
}请注意,这将导致graphql的典型n+1问题,这意味着当您获取一个成分数组时,对于每个配料,graphql必须对属于每个成分的膳食执行db查询,n+1问题的解决方案是使用批处理数据请求的数据机
https://stackoverflow.com/questions/71759327
复制相似问题