Asumsikan Anda memiliki tipe GraphQL dan itu mencakup banyak bidang. Bagaimana cara menanyakan semua bidang tanpa menuliskan kueri panjang yang menyertakan nama semua bidang?
Misalnya, Jika saya memiliki bidang ini:
public function fields()
{
return [
'id' => [
'type' => Type::nonNull(Type::string()),
'description' => 'The id of the user'
],
'username' => [
'type' => Type::string(),
'description' => 'The email of user'
],
'count' => [
'type' => Type::int(),
'description' => 'login count for the user'
]
];
}
Untuk query semua field biasanya querynya seperti ini:
FetchUsers{users(id:"2"){id,username,count}}
Tetapi saya ingin cara mendapatkan hasil yang sama tanpa menulis semua bidang, seperti ini:
FetchUsers{users(id:"2"){*}}
//or
FetchUsers{users(id:"2")}
Apakah ada cara untuk melakukan ini di GraphQL ??
Saya menggunakan perpustakaan Folkloreatelier / laravel-graphql .
php
laravel
graphql
graphql-php
BlackSigma
sumber
sumber
Jawaban:
Sayangnya apa yang ingin Anda lakukan tidak memungkinkan. GraphQL mengharuskan Anda untuk secara eksplisit menentukan bidang mana yang ingin Anda kembalikan dari kueri Anda.
sumber
Ya, Anda dapat melakukan ini dengan menggunakan introspeksi . Buat kueri GraphQL seperti (untuk tipe UserType )
dan Anda akan mendapatkan respons seperti (nama bidang yang sebenarnya akan bergantung pada definisi skema / jenis Anda yang sebenarnya)
Anda kemudian dapat membaca daftar bidang ini di klien Anda dan secara dinamis membuat kueri GraphQL kedua untuk mendapatkan semua bidang ini.
Ini bergantung pada Anda mengetahui nama tipe yang ingin Anda dapatkan bidangnya - jika Anda tidak tahu tipenya, Anda bisa mendapatkan semua tipe dan bidang bersama-sama menggunakan introspeksi seperti
CATATAN: ini adalah data GraphQL over-the-wire - Anda sendiri yang mengetahui cara membaca dan menulis dengan klien Anda yang sebenarnya. Pustaka javascript graphQL Anda mungkin sudah menggunakan introspeksi dalam beberapa kapasitas, misalnya perintah apollo codegen menggunakan introspeksi untuk menghasilkan tipe.
sumber
Saya kira satu-satunya cara untuk melakukan ini adalah dengan memanfaatkan fragmen yang dapat digunakan kembali:
sumber
Saya menghadapi masalah yang sama ini ketika saya perlu memuat data lokasi yang telah saya serialkan ke dalam database dari Google Places API. Umumnya saya ingin semuanya sehingga berfungsi dengan peta tetapi saya tidak ingin menentukan semua bidang setiap saat.
Saya bekerja di Ruby jadi saya tidak bisa memberi Anda implementasi PHP tetapi prinsipnya harus sama.
Saya mendefinisikan jenis skalar khusus yang disebut JSON yang hanya mengembalikan objek JSON literal.
Implementasi ruby seperti itu (menggunakan graphql-ruby)
Kemudian saya menggunakannya untuk objek kami seperti itu
Saya akan menggunakan ini dengan sangat hemat, menggunakannya hanya di tempat Anda tahu Anda selalu membutuhkan seluruh objek JSON (seperti yang saya lakukan dalam kasus saya). Jika tidak, itu mengalahkan objek GraphQL secara lebih umum.
sumber
{"en": "Hello", "es": "Hola"}
. Dan karena setiap pengguna dapat mengimplementasikan subset bahasanya sendiri untuk kasus penggunaannya, tidak masuk akal bagi UI untuk menanyakan setiap subset yang mungkin. Teladan Anda bekerja dengan sempurna.Format kueri GraphQL dirancang untuk memungkinkan:
Namun, menurut dokumentasi GraphQL , Anda dapat membuat fragmen untuk membuat set pilihan lebih dapat digunakan kembali:
Kemudian Anda dapat menanyakan semua detail pengguna dengan:
Anda juga dapat menambahkan kolom tambahan di samping fragmen Anda :
sumber
Paket graphql-type-json mendukung JSON jenis skalar khusus. Gunakan itu dapat menunjukkan semua bidang objek json Anda. Berikut adalah tautan contoh di ApolloGraphql Server. https://www.apollographql.com/docs/apollo-server/schema/scalars-enums/#custom-scalars
sumber