Pemilihan bidang (Proyeksi) di GraphQL

Di GraphQL, bidang yang Anda minta menentukan dengan tepat apa yang dikembalikan oleh penyusun API Data (DAB), tidak lebih, tidak kurang. DAB mengkompilasi pilihan ini ke dalam SQL berparameter, termasuk hanya kolom yang dipetakan (terekspos) yang Anda minta dan kolom tambahan yang harus diambilnya secara internal. Ini mungkin termasuk kolom yang diperlukan untuk hubungan (kunci asing), kunci primer, atau pengurutan stabil yang digunakan dalam penomoran halaman dan konstruksi kursor.

Nota

GraphQL tidak memiliki wildcard seperti SELECT *. Klien harus menentukan setiap bidang secara eksplisit.

Buka versi REST dokumen ini.

Pilihan dasar

Mengkueri beberapa bidang yang dipetakan.

Kueri GraphQL

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

SQL Konseptual

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

Contoh tanggapan

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

Alias bidang

Alias mengganti nama bidang dalam respons, bukan di database. Lapisan SQL tidak alias untuk nama bidang GraphQL; aliasing terjadi setelah pengambilan data.

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

SQL Konseptual

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

Contoh tanggapan

Dengan alias:

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

Pilihan berlapis

Hubungan yang ditentukan dalam konfigurasi memungkinkan kueri berlapis. SQL konseptual di bawah ini menunjukkan satu gabungan. Dalam praktiknya, DAB dapat menjalankan satu atau beberapa kueri berparameter (misalnya, kueri induk ditambah pengambilan anak batch) daripada satu gabungan yang diratakan.

Kueri GraphQL

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

SQL Konseptual

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;

Contoh tanggapan

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

Pilihan satu ke banyak

Anda juga dapat melintasi hubungan terbalik. Sekali lagi, SQL bersifat konseptual; eksekusi aktual dapat mendeduplikasi baris induk dan mewujudkan koleksi anak secara terpisah.

Kueri GraphQL

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

SQL Konseptual

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;

Contoh tanggapan

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

Konfigurasi contoh

{
  "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" ]
        }
      }
    }
  }
}

Lihat juga

Konsep REST GraphQL Tujuan
Projection $select items Pilih bidang mana yang akan dikembalikan
Penyaringan $filter saringan Membatasi baris menurut kondisi
Pengurutan $orderby orderBy Tentukan urutan pengurutan
Ukuran halaman $first first Membatasi jumlah item per halaman
Kelanjutan $after sesudah Lanjutkan dari halaman terakhir menggunakan kursor

Nota

Kata kunci REST dimulai dengan $, mengikuti konvensi OData.