দীর্ঘ প্রশ্ন জিজ্ঞাসা না করে সমস্ত গ্রাফকিউএল টাইপ ক্ষেত্রগুলি কীভাবে জিজ্ঞাসা করবেন?


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 টি কিছু ক্ষেত্রটি টাইপ করুন এবং আশা করি আপনি টাইপ করবেন না :)
স্কা

32
বাহ, আমি কেবল গ্রাফকিউএল থেকে শুরু করছি, এবং এটি একটি গুরুতর ডাব্লুটিএফ F
user949300

1
এটি উপলব্ধি করা যায় না যে এটি সমর্থিত নয়, কল্পনা করুন আপনার কাছে শিক্ষার্থী এবং শ্রেণি অবজেক্ট রয়েছে, শিক্ষার্থীর মাঠের "ক্লাস" রয়েছে যা সে যে সমস্ত ক্লাসে উপস্থিত থাকে তার তালিকা করে, শ্রেণিতে ক্ষেত্রের "ছাত্র" থাকে যা সেই শ্রেণিতে উপস্থিত সমস্ত শিক্ষার্থীদের তালিকা করে। একটি চক্রাকার কাঠামো চালিয়ে যায়। এখন আপনি যদি সমস্ত ক্ষেত্র সহ সমস্ত শিক্ষার্থীর জন্য অনুরোধ করেন তবে এতে কি ফিরে আসা ক্লাসের সমস্ত ক্ষেত্র অন্তর্ভুক্ত থাকবে? এবং এই ক্লাসগুলির ছাত্র রয়েছে, তাদের ক্ষেত্রগুলিও কি অন্তর্ভুক্ত করা হবে? এবং শিক্ষার্থীদের ক্লাস রয়েছে, ...
বুকসি

আমার এই প্রশ্নটি ছিল এবং এটি এমন ছিল যাতে আমি দেখতে পেতাম যে এমনকি টানতে কী পাওয়া যায়। প্রচুর গ্রাফকিউএল ক্লায়েন্ট (যেমন গ্রাফিক্যকিউএল, gatsbyjs.org/docs/running-queries-with-graphiql দেখুন ) এর জন্য একটি স্কিমা এক্সপ্লোরার রয়েছে যা আপনাকে যা টানতে পারে তার সাথে উপস্থাপনের জন্য অন্তর্মুখী ব্যবহার করে, যদি "সবকিছু পেতে" ইচ্ছুক হওয়ার পেছনে কারণ থাকে তবে "।
জেমস

উত্তর:


120

দুর্ভাগ্যক্রমে আপনি যা করতে চান তা সম্ভব নয়। গ্রাফকিউএল আপনাকে আপনার কোয়েরি থেকে কোন ক্ষেত্রগুলি ফিরে আসতে চাইবে তা নির্দিষ্ট করে দেওয়ার বিষয়ে আপনাকে স্পষ্ট হওয়া দরকার।


5
ঠিক আছে, এবং যদি আমি ব্যাক-এন্ড থেকে কোনও অজানা ফর্মের জন্য অনুরোধ করি যা আমার প্রক্সি বা ফিরে পাঠানোর কথা?
meandre

19
@ ম্যান্ড্রে, গ্রাফিক্যালের পুরো ধারণাটি হ'ল "অজানা ফর্ম" বলে কিছুই নেই।
s.meijer

2
@ ম্যান্ড্রে, নীচের আমার উত্তরটি আপনার কাজে লাগতে পারে?
টায়রন উইলসন

এটা সবচেয়ে API কুয়েরি ভাষা এবং প্রোটোকল ?, @meandre সমগ্র ধারণা নয়
ক্লাইস্টার্স

আকর্ষণীয়, গ্রাফিকিউএল
অ্যান্ডি এমসি কুল্লো

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
যদি আমি এটি করে থাকি তবে তারপরেও আমাকে প্রতিটি ফিল্ডের নাম লিখতে হবে "কমপক্ষে খণ্ডে", ডাইনি যা আমি এড়াতে চাইছিলাম তা মনে হয় গ্রাফকিউএল আমাদের সুস্পষ্ট হতে বাধ্য করে।
ব্ল্যাকসিগমা

এটি কীভাবে একটি পোষ্টমান কোয়েরিতে যুক্ত করবেন? বা স্ট্রাইফাইড জেএসএন তৈরি করতে jquery / UI ফ্রেমওয়ার্ক। এই গ্রাফিক্যুয়ালটি বাস্তব বিকাশের উদ্দেশ্যে অকেজো বলে মনে হচ্ছে।
এমফাইসালহাইডার

এটি কেবল পুনরায় ব্যবহারের উদ্দেশ্যে।
হেনোক তেসফায়

@ ব্ল্যাকসিগমা গ্রাফকিউএল ডকুমেন্টেশন বিবেচনা করে , এটি সেরা উত্তর হিসাবে গ্রহণযোগ্য হওয়া উচিত
জেপি ভেন্টুরা

4
@ জেপিভেন্তুরা: না আমার বন্ধু, ধারণা এবং প্রয়োগের ক্ষেত্রে পুনরায় ব্যবহারযোগ্যতা এবং ওয়াইল্ডকার্ডের মধ্যে পার্থক্য রয়েছে। এই টুকরোটির উদ্দেশ্যটি ডকুমেন্টেশনে স্পষ্ট যে "গ্রাফকিউএলে পুনরায় ব্যবহারযোগ্য একককে টুকরোগুলি বলা হয়"। টুকরা ব্যবহার দরকারী তবে প্রশ্নের উত্তর নয়।
ব্ল্যাকসিগমা

11

আমি যখন গুগল প্লেস এপিআই থেকে ডেটাবেজে সিরিয়ালযুক্ত অবস্থানের ডেটা লোড করার প্রয়োজন হয়েছিল তখন আমি এই একই সমস্যার মুখোমুখি হয়েছিলাম। সাধারণত আমি পুরো জিনিসটি চাই তাই এটি মানচিত্রের সাথে কাজ করে তবে আমি প্রতিবার সমস্ত ক্ষেত্র নির্দিষ্ট করতে চাইনি।

আমি রুবিতে কাজ করছিলাম তাই আমি আপনাকে পিএইচপি বাস্তবায়ন দিতে পারি না তবে নীতিটি একই হওয়া উচিত।

আমি 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 অবজেক্টের প্রয়োজন (যেমনটি আমি আমার ক্ষেত্রে করেছি)। অন্যথায় এটি গ্রাফকিউএলকে আরও সাধারণভাবে বলতে পারা যায়।


1
এই আমার প্রয়োজন ঠিক এটি, ধন্যবাদ। আমার ব্যবহারের ক্ষেত্রে হ'ল পুরো সিস্টেম জুড়ে আমার কাছে ব্যবহারকারী অনুবাদযোগ্য স্ট্রিং রয়েছে এবং সেগুলি ডিবিতে জসন হিসাবে সংরক্ষণ করা হয় {"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

প্যাকেজ গ্রাফিক্যাল-টাইপ-জসন কাস্টম-স্কেলার প্রকার জেএসওএন সমর্থন করে। এটি ব্যবহার করুন এটি আপনার জসন বস্তুর সমস্ত ক্ষেত্রটি প্রদর্শন করতে পারে। অ্যাপোলোগ্রাফিকল সার্ভারে উদাহরণটির লিঙ্কটি এখানে। https://www.apollographql.com/docs/apollo-server/schema/scalars-enums/#custom-scalars

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.