次の方法で共有


GraphQL でのフィールド選択 (プロジェクション)

GraphQL では、要求するフィールドは、Data API Builder (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 は、1 つの結合を示しています。 実際には、DAB では、単一のフラット化された結合ではなく、1 つ以上のパラメーター化されたクエリ (親クエリとバッチ子フェッチなど) を実行できます。

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 品目 返すフィールドを選択する
フィルタリング $filter フィルター 条件で行を制限する
並べ替え $orderby orderBy 並べ替え順序を定義する
ページ サイズ $first first ページあたりのアイテム数を制限する
継続 $after カーソルを使用して最後のページから続行する

REST キーワードは、OData 規則に従って、 $で始まります。