Graphql 使用带关系解析程序的prisma客户端

Graphql 使用带关系解析程序的prisma客户端,graphql,prisma,graphcool,prisma-graphql,Graphql,Prisma,Graphcool,Prisma Graphql,我正在graphql服务器中使用 按照最佳实践,我使解析器层只是一个薄薄的层,它将数据的实际获取委托给数据访问层。数据访问层还使用以下功能执行授权和请求级缓存 在此设置中,我找不到获取实体关系的好方法,因为prisma client使用promise对象上函数调用的链接来获取关系,但由于我的解析器没有直接调用prisma client,因此它无法访问prisma client promise,因此无法调用链接关系函数 请参见以下示例: 样本数据模型: type Apartment { id:

我正在graphql服务器中使用

按照最佳实践,我使解析器层只是一个薄薄的层,它将数据的实际获取委托给数据访问层。数据访问层还使用以下功能执行授权和请求级缓存

在此设置中,我找不到获取实体关系的好方法,因为prisma client使用promise对象上函数调用的链接来获取关系,但由于我的解析器没有直接调用prisma client,因此它无法访问prisma client promise,因此无法调用链接关系函数

请参见以下示例:

样本数据模型:

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();
}
这不是一个好的实现,原因如下:

  • 我已经在缓存中找到了公寓,但我不能重复使用,因为我必须再次找到公寓才能到达大楼
  • 对于公寓中的每个关系,我都需要实现这样一个特殊的函数,以便通过apartemntId获取特定的关系。这是浪费,而且忽略了prisma为我实现大多数查询的意义
  • 有没有更好的方法来实现这一点,我错过了

    我知道prisma binding可以解决这个问题,但是:

  • Prisma客户端似乎是使用primsa的最新方式
  • 出于授权目的,prisma客户端功能更强大

  • 您好@brafdlog,我对您的解析器设置有点困惑。从
    上下文
    检索的
    apartmentDAO
    buildingDAO
    对象来自哪里?通常,在解析器中获取关系不应该是一个问题,因为Prisma客户端有一个内置的数据加载器,并将批处理发送到Prisma的请求。我们有与Prisma客户建立关系的参考资料。这种方法与使用Prisma绑定一样有效。Hi@nburk,DAO是在上下文中传递的。原因是每个DAO都使用一个dataloader来缓存同一请求中的调用,因此我为每个请求创建一个实例。我不知道prisma客户端在内部使用数据加载器,这可能会使我的内部加载器冗余。但问题仍然存在——与DAOs的分离是为了常见的获取逻辑,如授权、日志等。不希望在每个解析器中重复该操作。顺便说一句,关于prisma客户端中的数据加载器是如何工作的,有什么参考资料吗?不幸的是,我们的文档目前还没有,所以我们没有任何关于prisma客户端中数据加载器是如何工作的文档。我们很快会补充这一点。同时,GitHub问题可能有助于获得更多的上下文。谢谢。对如何改进此实现有何见解?如果我能得到相关实体的ID,这本身就可以解决冗余查询,但我认为这目前是不可能的。