GraphQL для Drupalers - Часть 4. Извлечение сущностей

  1. TL; DR
  2. NodeQuery
  3. Используйте The Views

В последний пост мы говорили об основных строительных блоках каждого запроса GraphQL - полях. Мы обсудили их типы и особенности, а также описали правила, согласно которым поля Drupal превращаются в поля GraphQL. На этой неделе мы собирались расширить тему и охватить создание полей, но Даниэль Нойола задал интересный вопрос в комментарии ниже к одной из недавних статей:

Как я могу отфильтровать результаты в nodeQuery? Как и в обычном представлении или с предложением «где» в выражении SQL. Я заметил, что он получает NodeQueryFilterInput, но я не вижу, как его использовать.

Выборка объектов на основе фильтра или набора фильтров является распространенным случаем, поэтому сначала остановимся на этом.

TL; DR

Есть два способа запросить хранилище сущностей. Во-первых, через поля entityQuery, которые поставляются с основным модулем, но ограничены в функциональности. Они позволяют нам фильтровать только по базовым полям, и нет способа использовать оператор, отличный от « равно» . Другой подход гораздо более мощный, поскольку он основан на представлениях. Для этого требуется установить дополнительный модуль - graphql_views . Начнем со встроенного способа.

NodeQuery

Каждый тип сущности в системе получает свое собственное поле запроса. Давайте посмотрим в проводнике, как это выглядит для узлов:

Таким образом, это поле (синее) с 3 аргументами: смещение, лимит и фильтр (фиолетовое), которое возвращает значение типа EntityQueryResult (все типы выделены желтым цветом).

Первые два аргумента, offset и limit , предназначены для подкачки страниц и работают так же, как в SQL. Оба являются целыми числами, и оба имеют значения по умолчанию 0 и 10 соответственно (зеленый). Аргументы, которые имеют значения по умолчанию, могут быть опущены. Мы будем использовать эту функцию в ближайшее время.

Последний аргумент - фильтр - имеет сложный тип NodeQueryFilterInput. Давайте нажмем на это:

Таким образом, он содержит все базовые поля запрашиваемого типа сущности. Недостаточно выдавать произвольные запросы, но достаточно для простого варианта использования. Вот как мы можем получить список статей, созданных данным пользователем:

Мы не указали ни смещение, ни предел, поэтому они получат значения по умолчанию. Это означает, что вывод будет содержать не более 10 результатов, начиная с номера результата 0.

Это круто, но что если мы захотим упорядочить статьи по идентификатору узла (nid), чтобы показывать только последние статьи? Или фильтр по тегам? Или получить текст заголовка изображения, прикрепленного к медиа-объекту, связанному с первым событием, которое начинается после даты выпуска статьи?

Используйте The Views

Ответ таков: мы можем сделать это так, как мы обычно делаем это в Drupal - с целью. Интеграция представлений перенесена в отдельный проект, поэтому ее необходимо загружать с помощью composer (для composer требуется drupal / graphql_views ) из drupal.org или из GitHub ,

С включенным graphql_views мы можем добавить отображение GraphQL к любому представлению в системе.

С включенным graphql_views мы можем добавить отображение GraphQL к любому представлению в системе

Теперь мы можем сортировать результаты, фильтровать их по полям содержимого и добавлять отношения. У нас также есть возможность вернуть либо полные сущности, либо просто набор полей, либо даже результаты поиска, взятые прямо с поискового сервера.

У нас также есть возможность вернуть либо полные сущности, либо просто набор полей, либо даже результаты поиска, взятые прямо с поискового сервера

Контекстные фильтры, установленные в представлении, автоматически превращаются в аргументы поля GraphQL. Давайте посмотрим на пример:

Давайте посмотрим на пример:

Это поле представляет собой простое представление, показывающее узлы. Он имеет один контекстный фильтр - Content: Authored by - поэтому соответствующий тип ввода состоит только из одного поля:

Он имеет один контекстный фильтр - Content: Authored by - поэтому соответствующий тип ввода состоит только из одного поля:

и его тип строки установлен в Entity (как показано на скриншоте выше), поэтому результат будет иметь тип NodeArticle:

и его тип строки установлен в Entity (как показано на скриншоте выше), поэтому результат будет иметь тип NodeArticle:

Мы можем использовать поле так:

Интеграция представлений - довольно широкая тема, поэтому в следующем посте мы могли бы попытаться раскрыть ее более подробно. Есть еще несколько интересных аспектов, таких как сортировка, открытые фильтры и присоединение представлений к сущностям, поэтому мы сосредоточимся на этом, чтобы полностью ответить на вопрос Дэниела.

Для тех, кто интересуется серверной стороной, я бы порекомендовал отличную серию расширений GraphQL от Филиппа Мелаба. Первый пост, который объясняет, как создавать поля, находится здесь: Расширение GraphQL: часть 1 - поля ,

PS GraphQL Views пока не стабилен. На самом деле, две проблемы были обнаружены и исправлены в процессе написания этой статьи. Если вы обнаружили ошибку, пожалуйста, сообщите о ней GitHub или дайте нам знать в канале #graphql на Drupal Slack ,

Другие посты в серии

Или фильтр по тегам?
Или получить текст заголовка изображения, прикрепленного к медиа-объекту, связанному с первым событием, которое начинается после даты выпуска статьи?