GraphQL では、要求するフィールドは、Data API Builder (DAB) が返す内容を正確に定義します。それ以上、少なからず。 DAB は、これらの選択をパラメーター化された SQL にコンパイルします。これには、要求したマップされた (公開されている) 列と、内部でフェッチする必要がある追加の列のみが含まれます。 これには、リレーションシップ (外部キー)、主キー、または改ページやカーソルの構築で使用される安定した順序に必要な列が含まれる場合があります。
注
GraphQL には、 SELECT *のようなワイルドカードがありません。 クライアントは、各フィールドを明示的に指定する必要があります。
基本的な選択
マップされたフィールドのクエリを実行する。
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 規則に従って、 $で始まります。