GraphQL筛选子解析器中的父数据

GraphQL筛选子解析器中的父数据,graphql,graphql-js,graphql-php,Graphql,Graphql Js,Graphql Php,我试图弄清楚如何使用GraphQL在父子关系中实现自底向上过滤 考虑以下基本类型层次结构,对停车场和可用停车位进行建模: type ParkingLot { id: Int! spots: [ParkingSpot] } type ParkingSpot { id: Int!, occupied: Boolean! } 我想实现我的解析器,使我能够检索至少有一个免费停车位的所有停车场 query AllParkingLotsWithStatus($status : Boole

我试图弄清楚如何使用GraphQL在父子关系中实现自底向上过滤

考虑以下基本类型层次结构,对停车场和可用停车位进行建模:

type ParkingLot {
  id: Int!
  spots: [ParkingSpot]
}

type ParkingSpot {
  id: Int!,
  occupied: Boolean!
}
我想实现我的解析器,使我能够检索至少有一个免费停车位的所有停车场

query AllParkingLotsWithStatus($status : Boolean = false) {
   ParkingLot {
     id 
     spots(occupied: $status)  {
       id
     }
   }
}
我正在使用的GraphQL的具体实现是基于PHP的,并且是可用的,但是任何基于JS的实现都会为我指明正确的方向。我知道有一些库支持使用“where:”参数进行过滤,但我必须自己实现这个机制,因为我使用的库不提供现成的功能

我探讨的一个想法是在ParkingLot的解析器中简单地编写一个JOIN语句,但我觉得这不符合GraphQL的精神

我想到的另一个想法是重写查询,使其首先检索ParkingSlots,并且仅当ParkingSlots的状态可用时才获取其父级。但是,这可能需要大量的计算,因为停车场比停车位少,因此从父对象导航到子对象可能需要较少的计算

您建议哪种方法不会归结为更改类型层次结构(我无法做到这一点)。是否有一种方法可以在子节点的冲突解决程序中发生某种情况时立即拒绝父节点,或者这会被认为超出GraphQL实现的范围,更像是正在使用的实际库的一个功能?我想,因为有些库支持使用“where:”子句进行过滤,所以这必须是可能的,而且不应该太复杂

几点

设计模式的首选方法如下:

type Query {
  parkingLots(where: ParkingLotFilter)
}

input ParkingLotFilter {
  isFull: Boolean
  # other conditions
}
虽然可以将
已占用的
参数添加到
停车点
,但在提供该参数时,让
停车场
查询仅返回有空闲停车点的停车场是非常不直观的。如果我指定该参数,我希望得到all停车场,每个停车场上的
spots
字段仅限于已占用/未占用的车位。换句话说,字段的筛选器只应影响该字段的分辨率,而不应影响父字段的分辨率

这就引出了第二点——您的问题可以简单地通过客户端解决。在
spots
上公开
occubited
参数并将其保留在该位置可能就足够了。然后,客户机将获得一个停车场列表,其中一些停车场的
spots
字段可能有一个空数组。然后,客户只需根据
点的长度
字段过滤停车场列表,即可获得已满或未满停车场的列表

如果这是不可接受的,那么处理此问题的最简单方法就是按照您的建议进行连接。这样做并没有什么“不符合GraphQL的精神”——许多工具都喜欢并有效地采用相同的方法。通过使用联接,可以获取每个停车场的停车位,并将其作为解析程序中返回的停车场对象的一部分返回。只要对象具有
spots
属性,该属性的值将用于解析
spots
字段(前提是您不编写自己的解析程序)