Я пытаюсь понять, как реализовать фильтрацию снизу вверх в отношениях родитель-потомок, используя 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 была бы действительно полезна, чтобы указать мне направильное направление.Я знаю, что есть библиотеки, которые поддерживают фильтрацию с использованием параметров «где:», но я должен был бы реализовать этот механизм сам, так как библиотека, которую я использую, не предлагает его из коробки.
Одна из идей, которую я исследовал, заключалась в том, чтобы просто написать оператор JOIN внутри распознавателя для ParkingLot, но я чувствую, что это не в духе GraphQL.
Еще одна идея, о которой я подумал, - переписать запрос так, чтобы он сначала извлекал парковочные места и получал их родителя, только если их статус доступен.Однако это может потребовать значительных вычислительных ресурсов, поскольку парковочных мест будет меньше, чем парковочных мест, поэтому переход между родителем и ребенком будет, вероятно, менее вычислительным.
Какой подход, по вашему мнению, не сводится кдля изменения иерархии типов (я не в состоянии сделать это).Возможно, существует ли способ отклонить родительский узел, как только в распознавателе дочернего объекта возникает какое-то условие, или это будет рассматриваться вне рамок реализации GraphQL и больше похоже на функцию используемой библиотеки?Я полагаю, поскольку некоторые библиотеки там поддерживают фильтрацию с использованием предложений "where:", это должно быть возможно и не должно быть сложным.