एक लंबी क्वेरी लिखे बिना सभी ग्राफ़क प्रकार फ़ील्ड को कैसे क्वेरी करें?


130

मान लें कि आपके पास एक ग्राफ़िकल प्रकार है और इसमें कई फ़ील्ड शामिल हैं। सभी फ़ील्ड के नाम शामिल करने वाली लंबी क्वेरी को लिखे बिना सभी फ़ील्ड को कैसे क्वेरी करें?

उदाहरण के लिए, यदि मेरे पास ये क्षेत्र हैं:

 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'
            ]

        ];
    }

सभी फ़ील्ड को क्वेरी करने के लिए आमतौर पर क्वेरी कुछ इस तरह होती है:

FetchUsers{users(id:"2"){id,username,count}}

लेकिन मैं सभी क्षेत्रों को लिखने के बिना एक ही परिणाम चाहता हूं, कुछ इस तरह से:

FetchUsers{users(id:"2"){*}}
//or
FetchUsers{users(id:"2")}

वहाँ एक तरह से यह करने के लिए है?

मैं फोकलोरिएटेलियर / लार्वेल-ग्रेफिकल लाइब्रेरी का उपयोग कर रहा हूं ।


4
आप पूछ रहे हैं कि कुछ ऐसा कैसे किया जा सकता है, जिसे डिजाइन के आधार पर ग्राफक्यूएल समर्थन नहीं करता।
ट्रैविस वेब

12
बस उन 40 कुछ फ़ील्ड्स को टाइप करें और आशा करें कि आप टाइपो नहीं बनाते :)
Ska

32
वाह, मैं अभी रेखांकन में शुरू कर रहा हूं, और यह एक गंभीर डब्ल्यूटीएफ है।
user949300

1
यह समझ में आता है कि यह समर्थित नहीं है, कल्पना कीजिए कि आपके पास छात्र और कक्षा की वस्तुएं हैं, छात्र के पास "कक्षाएं" हैं जो उन सभी वर्गों को सूचीबद्ध करता है जो वह उपस्थित होता है, कक्षा में "छात्रों" को सूचीबद्ध करता है जो उस कक्षा में आने वाले सभी छात्रों को सूचीबद्ध करता है। यह एक चक्रीय संरचना है। अब यदि आप सभी क्षेत्रों के सभी छात्रों के लिए अनुरोध करते हैं, तो क्या इसमें सभी कक्षाओं के क्षेत्र भी शामिल होंगे? और जिन कक्षाओं में छात्र हैं, क्या उनके क्षेत्र भी शामिल होंगे? और छात्रों की कक्षाएं हैं, ...
Buksy

मेरे पास यह सवाल था और यह इतना था कि मैं देख सकता था कि खींचने के लिए क्या उपलब्ध था। GraphQL ग्राहकों के बहुत सारे (जैसे GraphiQL, देख gatsbyjs.org/docs/running-queries-with-graphiql ) एक स्कीमा एक्सप्लोरर आत्मनिरीक्षण का उपयोग करता है कि आप क्या खींच सकते हैं के साथ पेश करने के लिए है, यह है कि अगर "सब कुछ पाने के लिए चाहते हैं के पीछे का कारण है "।
जेम्स

जवाबों:


120

दुर्भाग्य से आप जो करना चाहते हैं वह संभव नहीं है। ग्राफक्लाइन आपको यह निर्दिष्ट करने के लिए स्पष्ट होना चाहिए कि आप अपनी क्वेरी से किन क्षेत्रों में लौटना चाहते हैं।


5
ठीक है, और अगर मैं बैकएंड से किसी अज्ञात रूप के कुछ ऑब्जेक्ट का अनुरोध करता हूं जो मुझे प्रॉक्सी करने या वापस भेजने के लिए माना जाता है?
मेन्ड्रे

19
@meandre, graphql का पूरा विचार यह है कि "अनकाउंट फॉर्म" जैसी कोई चीज नहीं है।
sme.meijer

2
@meandre, नीचे मेरा उत्तर आपके लिए उपयोग किया जा सकता है?
टायरोन विल्सन

क्या यह अधिकांश एपीआई क्वेरी भाषाओं और प्रोटोकॉल का पूरा विचार नहीं है ?, @meandre
Clijsters

दिलचस्प है, यह वास्तव में एक अलग मानसिकता है जब ग्राफकल का उपयोग किया जाता है
मर्कुल्फ

91

हां, आप आत्मनिरीक्षण का उपयोग करके ऐसा कर सकते हैं । एक ग्राफक्लाइन क्वेरी बनाएं जैसे (टाइप यूजर टाइप के लिए )

{
   __type(name:"UserType") {
      fields {
         name
         description
      }  
   }
}

और आपको एक प्रतिक्रिया मिलेगी (वास्तविक फ़ील्ड नाम आपके वास्तविक स्कीमा / प्रकार की परिभाषा पर निर्भर करेगा)

{
  "data": {
    "__type": {
      "fields": [
        {
          "name": "id",
          "description": ""
        },
        {
          "name": "username",
          "description": "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only."
        },
        {
          "name": "firstName",
          "description": ""
        },
        {
          "name": "lastName",
          "description": ""
        },
        {
         "name": "email",
          "description": ""
        },
        ( etc. etc. ...)
      ]
    }
  }
}

फिर आप अपने क्लाइंट में फ़ील्ड की इस सूची को पढ़ सकते हैं और इन सभी फ़ील्ड्स को प्राप्त करने के लिए गतिशील रूप से एक दूसरी ग्राफ़िकल क्वेरी का निर्माण कर सकते हैं।

यह आप पर निर्भर करता है कि आप उस प्रकार का नाम जानते हैं जिसके लिए आप फ़ील्ड प्राप्त करना चाहते हैं - यदि आप प्रकार नहीं जानते हैं, तो आप आत्मनिरीक्षण का उपयोग करके सभी प्रकार और फ़ील्ड एक साथ प्राप्त कर सकते हैं

{
  __schema {
    types {
      name
      fields {
        name
        description
      }
    }
  }
}

ध्यान दें: यह ओवर-द-वायर ग्राफ़कॉक डेटा है - आप अपने वास्तविक ग्राहक के साथ पढ़ने और लिखने के तरीके का पता लगाने के लिए स्वयं हैं। आपका ग्राफकॉल जावास्क्रिप्ट पुस्तकालय पहले से ही कुछ क्षमता में आत्मनिरीक्षण को नियोजित कर सकता है, उदाहरण के लिए अपोलो कोडेगन कमांड प्रकार उत्पन्न करने के लिए आत्मनिरीक्षण का उपयोग करता है।


लगता है जैसे एक को पुनरावर्ती प्रकारों के बारे में ध्यान देना चाहिए। यदि आप पेड़ के नीचे चले गए और एक प्रकार से टकरा गए, जिसमें स्वयं, किसी न किसी रूप में (सूची, एकल या अन्य ..) हैं, तो आप एक अनंत पुनरावृत्ति के लिए हो सकते हैं।
मिलोस ग्रुजिक

यह वास्तव में इस विशेष क्वेरी के साथ मेरे अनुभव में नहीं होता है - क्वेरी ही संकल्प गहराई को परिभाषित करता है।
मार्क चेकरियन

उपरोक्त उत्तर आपको केवल क्वेरी में उपलब्ध फ़ील्ड के प्रकार की अनुमति देता है। यह सभी ऑब्जेक्ट फ़ील्ड "मान" को वापस नहीं करता है, जो कि मूल प्रश्न के बारे में है।
क्वांटडैडी

4
उत्तर के अनुसार, आपको पहले क्वेरी के परिणामों के आधार पर गतिशील रूप से दूसरी क्वेरी बनानी होगी - मैंने उसे पाठक के लिए एक अभ्यास के रूप में छोड़ दिया।
मार्क चकेरियन

39

मुझे लगता है कि ऐसा करने का एकमात्र तरीका पुन: प्रयोज्य टुकड़ों का उपयोग करना है:

fragment UserFragment on Users {
    id
    username
    count
} 

FetchUsers {
    users(id: "2") {
        ...UserFragment
    }
}

19
अगर मैंने ऐसा किया है, तो अभी भी मुझे प्रत्येक फ़ील्ड का नाम "कम से कम टुकड़े में" लिखना है, डायन जो मैं बचने की कोशिश कर रहा था, ऐसा लगता है कि ग्राफकलाइन हमें स्पष्ट होने के लिए मजबूर करता है।
ब्लैकसिग्मा

POSTMan क्वेरी में इसे कैसे जोड़ें? या कड़े JSON बनाने के लिए jquery / UI फ़्रैमवर्क। वास्तविक विकास के उद्देश्य के लिए यह ग्राफिसेल बेकार लगता है।
mfaisalhyder

यह पूरी तरह से पुन: उपयोग के उद्देश्य के लिए है।
हेनोक टेसेफ़े

ग्राफब्लिक प्रलेखन को ध्यान में रखते हुए @BlackSigma , इसे सर्वश्रेष्ठ उत्तर के रूप में स्वीकार किया जाना चाहिए
जेपी वेंचुरा

4
@JPVentura: नहीं मेरे दोस्त, अवधारणा और अनुप्रयोग दोनों में पुन: प्रयोज्य और वाइल्डकार्ड के बीच अंतर है। टुकड़े का उद्देश्य दस्तावेज़ीकरण में स्पष्ट है "रेखांकन में पुन: प्रयोज्य इकाइयां शामिल हैं जिन्हें टुकड़े कहा जाता है।" टुकड़े का उपयोग करना उपयोगी है, लेकिन सवाल का जवाब नहीं है।
ब्लैकसिग्मा

11

मुझे उसी मुद्दे का सामना करना पड़ा जब मुझे उस स्थान डेटा को लोड करने की आवश्यकता हुई जिसे मैंने डेटाबेस में Google स्थान एपीआई से क्रमबद्ध किया था। आम तौर पर मैं पूरी चीज चाहता हूं इसलिए यह नक्शे के साथ काम करता है लेकिन मैं हर बार सभी क्षेत्रों को निर्दिष्ट नहीं करना चाहता था।

मैं रूबी में काम कर रहा था इसलिए मैं आपको PHP कार्यान्वयन नहीं दे सकता लेकिन सिद्धांत समान होना चाहिए।

मैंने JSON नामक एक कस्टम स्केलर प्रकार को परिभाषित किया है जो सिर्फ एक शाब्दिक JSON ऑब्जेक्ट देता है।

रूबी कार्यान्वयन ऐसा था (ग्राफकल-रूबी का उपयोग करके)

module Graph
  module Types
    JsonType = GraphQL::ScalarType.define do
      name "JSON"
      coerce_input -> (x) { x }
      coerce_result -> (x) { x }
    end
  end
end

फिर मैंने इसे अपनी वस्तुओं के लिए उपयोग किया

field :location, Types::JsonType

मैं इसे बहुत संयम से इस्तेमाल करूंगा, हालांकि इसका उपयोग केवल आप ही करते हैं जहां आपको हमेशा संपूर्ण JSON ऑब्जेक्ट की आवश्यकता होती है (जैसा कि मैंने अपने मामले में किया था)। अन्यथा यह अधिक सामान्य रूप से बोलने वाले GraphQL की वस्तु को हरा रहा है।


1
यह बिल्कुल वही है जिसकी मुझे जरूरत थी, धन्यवाद। मेरा उपयोग मामला यह है कि मेरे पास पूरे सिस्टम में यूजर-ट्रांसलेटेबल स्ट्रिंग्स हैं, और वे db की तरह json के रूप में संग्रहीत हैं {"en": "Hello", "es": "Hola"}। और चूंकि प्रत्येक उपयोगकर्ता अपने उपयोग के मामले के लिए भाषाओं के अपने सबसेट को लागू कर सकता है, इसलिए यह यूआई के लिए हर संभव सबसेट को क्वेरी करने के लिए समझ में नहीं आता है। आपका उदाहरण पूरी तरह से काम करता है।
ल्यूक एह्र्समैन

2

ग्राफक्लाइन क्वेरी प्रारूप को अनुमति देने के लिए डिज़ाइन किया गया था:

  1. क्वेरी और परिणाम आकार दोनों बिल्कुल समान हैं
  2. सर्वर वास्तव में अनुरोधित फ़ील्ड जानता है , इस प्रकार क्लाइंट केवल आवश्यक डेटा डाउनलोड करता है।

हालाँकि, ग्राफक्यूक्यू प्रलेखन के अनुसार , आप चयन सेटों को अधिक पुन: प्रयोज्य बनाने के लिए टुकड़े बना सकते हैं :

# Only most used selection properties

fragment UserDetails on User {
    id,
    username
} 

तब आप सभी उपयोगकर्ता विवरणों को क्वेरी कर सकते हैं:

FetchUsers {
    users() {
        ...UserDetails
    }
}

आप अपने टुकड़े के साथ अतिरिक्त फ़ील्ड भी जोड़ सकते हैं :

FetchUserById($id: ID!) {
    users(id: $id) {
        ...UserDetails
        count
    }
}

0

पैकेज ग्रेफ्ल-टाइप-जसन कस्टम-स्केलर्स टाइप JSON का समर्थन करता है। इसका उपयोग करें यह आपके jSON ऑब्जेक्ट्स के सभी फ़ील्ड को दिखा सकता है। यहाँ ApolloGraphql सर्वर में उदाहरण का लिंक दिया गया है। https://www.apollographql.com/docs/apollo-server/schema/scalars-enums/#custom-scalars

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.