我在我的graphql服务器中使用prisma client。
按照最佳实践,我将解析程序层做成一个薄层,将实际的数据获取委托给数据访问层。数据访问层还使用dataloader执行授权和请求级别缓存之类的事情。
在此设置中,我找不到一种获取实体关系的好方法,因为prismaa客户端在promise对象上使用函数调用链来获取关系,但是由于我的解析器未直接调用prismaa客户端,因此它不会无法访问prisma客户承诺,因此无法调用链式关系函数。
请参见以下示例:
样本数据模型:
type Apartment {
id: ID!
floor: Int
building: Building @pgRelation(column: "building_id")
}
type Building {
id: ID!
buildingNumber: Int
}
公寓的样品解析器:
module.exports = {
Query: {
apartment: async (parent, { where }, { apartmentDAO }) => {
return apartmentDAO.apartment(where);
}
},
Apartment: {
building: async (parent, args, { buildingDAO }) => {
return buildingDAO.buildingByApartmentId(parent.id);
}
}
};
在数据访问层中buildingByApartmentId
的示例实现:
buildingByApartmentId: (apartmentId) => {
// Some authorization logic goes here
// Some other common data access logic goes here
// ....
return prismaClient.apartment({ id: apartmentId }).building();
}
由于某些原因,这不是一个很好的实现:
是否有更好的方法来实现我所缺少的?
我知道棱柱式装订将解决此问题,但是: