在 GraphQL 中,您請求的欄位會精確定義資料 API 產生器 (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 | 項目 | 選擇要傳回的欄位 |
| 篩選 | $filter | 篩選 | 依條件限制資料列 |
| 排序 | $orderby | orderBy | 定義排序順序 |
| 頁面大小 | $first | first | 限制每頁的項目數 |
| 繼續 | $after | 後 | 使用游標從最後一頁繼續 |
備註
REST 關鍵字會遵循 OData 慣例,以 開 $頭。