Поделиться через


Выбор поля (проекция) в GraphQL

В GraphQL поля, запрашиваемые вами, определяют точно то, что возвращает построитель данных (DAB), не больше, не меньше. DAB компилирует эти выборы в параметризованный SQL, включая только сопоставленные (предоставляемые) столбцы, которые вы попросили, и любые дополнительные столбцы, которые он должен получить внутренне. К ним могут относиться столбцы, необходимые для связей (внешних ключей), первичных ключей или стабильного упорядочения, используемых в построении страниц и создания курсоров.

Замечание

GraphQL не имеет подстановочных знаков, таких как SELECT *. Клиенты должны явно указать каждое поле.

Перейдите к версии REST этого документа.

Базовый выбор

Запрос нескольких сопоставленных полей.

Запрос GraphQL

query {
  books {
    items {
      id
      title
      price
    }
  }
}

Концептуальный SQL

SELECT
  id,
  sku_title AS title,
  sku_price AS price
FROM dbo.books;

Пример ответа

{
  "data": {
    "books": {
      "items": [
        {
          "id": 1,
          "title": "Dune",
          "price": 20
        }
      ]
    }
  }
}

Псевдонимы полей

Псевдонимы переименовают поля в ответе, а не в базе данных. Уровень SQL не является псевдонимом имен полей GraphQL; Псевдоним происходит после получения данных.

query {
  books {
    items {
      id
      bookTitle: title
      cost: price
    }
  }
}

Концептуальный SQL

SELECT
  id,
  sku_title AS title,
  sku_price AS price
FROM dbo.books;

Пример ответа

С псевдонимами:

{
  "data": {
    "books": {
      "items": [
        {
          "id": 2,
          "bookTitle": "Foundation",
          "cost": 18
        }
      ]
    }
  }
}

Вложенный выбор

Связи, определенные в конфигурации, разрешают вложенные запросы. В приведенном ниже концептуальном SQL показано одно соединение. На практике DAB может выполнять один или несколько параметризованных запросов (например, родительский запрос и пакетное получение дочернего элемента), а не одно не одно неструктурированное соединение.

Запрос GraphQL

query {
  books {
    items {
      id
      title
      category {
        id
        name
      }
    }
  }
}

Концептуальный SQL

SELECT
  b.id,
  b.sku_title AS title,
  c.id AS category_id,
  c.name AS category_name
FROM dbo.books AS b
JOIN dbo.categories AS c
  ON b.category_id = c.id;

Пример ответа

{
  "data": {
    "books": {
      "items": [
        {
          "id": 1,
          "title": "Dune",
          "category": {
            "id": 10,
            "name": "Sci-Fi"
          }
        },
        {
          "id": 2,
          "title": "Foundation",
          "category": {
            "id": 10,
            "name": "Sci-Fi"
          }
        }
      ]
    }
  }
}

Выбор "один ко многим"

Вы также можете пройти по обратной связи. Опять же, SQL является концептуальной; фактическое выполнение может дедупликировать родительские строки и материализовать дочерние коллекции отдельно.

Запрос GraphQL

query {
  categories {
    items {
      id
      name
      books {
        items {
          id
          title
        }
      }
    }
  }
}

Концептуальный SQL

SELECT
  c.id,
  c.name,
  b.id AS book_id,
  b.sku_title AS title
FROM dbo.categories AS c
JOIN dbo.books AS b
  ON c.id = b.category_id;

Пример ответа

{
  "data": {
    "categories": {
      "items": [
        {
          "id": 10,
          "name": "Sci-Fi",
          "books": {
            "items": [
              { "id": 1, "title": "Dune" },
              { "id": 2, "title": "Foundation" }
            ]
          }
        }
      ]
    }
  }
}

Пример конфигурации

{
  "runtime": {
    "pagination": {
      "default-page-size": 100,
      "max-page-size": 100000
    }
  },
  "entities": {
    "Book": {
      "source": {
        "type": "table",
        "object": "dbo.books"
      },
      "mappings": {
        "sku_title": "title",
        "sku_price": "price"
      },
      "relationships": {
        "book_category": {
          "cardinality": "one",
          "target.entity": "Category",
          "source.fields": [ "category_id" ],
          "target.fields": [ "id" ]
        }
      }
    },
    "Category": {
      "source": {
        "type": "table",
        "object": "dbo.categories"
      },
      "relationships": {
        "category_books": {
          "cardinality": "many",
          "target.entity": "Book",
          "source.fields": [ "id" ],
          "target.fields": [ "category_id" ]
        }
      }
    }
  }
}

См. также

Понятие REST GraphQL Цель
Projection $select items Выбор возвращаемых полей
Filtering $filter фильтр Ограничение строк по условию
Сортировка $orderby orderBy Определение порядка сортировки
Размер страницы $first first Ограничение количества элементов на страницу
Продолжение $after после Продолжить с последней страницы с помощью курсора

Замечание

Ключевые слова REST начинаются с $следующих соглашений OData.