2015-12-10 7 views
27

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

उदाहरण के लिए

, अगर मैं इन क्षेत्रों है:

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")} 

क्या ग्राफ़क्यू में ऐसा करने का कोई तरीका है एल ??

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

+1

आप पूछ रहे हैं कि ग्राफिकल, डिज़ाइन द्वारा, कुछ ऐसा कैसे करें, समर्थन नहीं करता है। –

+2

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

+0

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

उत्तर

22

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

+1

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

+5

@meandre, graphql का पूरा विचार यह है कि "अज्ञात रूप" जैसी कोई चीज़ नहीं है। –

+1

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

15

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

fragment UserFragment on Users { 
    id 
    username 
    count 
} 

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

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

5

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

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

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

गहरे लाल रंग का कार्यान्वयन की तरह इतना था (का उपयोग कर graphql-माणिक)

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 ऑब्जेक्ट की आवश्यकता होती है (जैसा कि मैंने अपने मामले में किया था)। अन्यथा यह आम तौर पर बोलने वाले ग्राफक्यूएल की वस्तु को हरा रहा है।

+1

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

13

हां, आप introspection का उपयोग करके ऐसा कर सकते हैं। जैसे

{ __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. ...) 
     ] 
    } 
    } 
} 

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

यह उस प्रकार का नाम जानने पर निर्भर करता है जिसके लिए आप फ़ील्ड प्राप्त करना चाहते हैं - यदि आपको इस प्रकार का पता नहीं है, तो उपरोक्त लिंक में सभी प्रकार के सभी प्रकार देखने के लिए अन्य प्रश्न हैं।

नोट: यह ओवर-द-वायर ग्राफिकल डेटा है - आप अपने वास्तविक ग्राहक के साथ पढ़ने और लिखने के तरीके को समझने के लिए स्वयं पर हैं।

संबंधित मुद्दे