itsource

긴 쿼리를 쓰지 않고 모든 GraphQL 유형 필드를 쿼리하려면 어떻게 해야 합니까?

mycopycode 2022. 11. 14. 21:41
반응형

긴 쿼리를 쓰지 않고 모든 GraphQL 유형 필드를 쿼리하려면 어떻게 해야 합니까?

GraphQL 유형이 있고 여러 필드가 포함되어 있다고 가정합니다.모든 필드의 이름을 포함하는 긴 쿼리를 기록하지 않고 모든 필드를 쿼리하려면 어떻게 해야 합니까?

예를 들어, 다음과 같은 필드가 있는 경우:

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

GraphQL로 하는 방법이 있나요?

민속학/라라벨그래프ql 라이브러리를 사용하고 있습니다.

유감스럽게도 당신이 하고 싶은 일은 불가능합니다.GraphQL에서는 쿼리에서 반환할 필드를 명시적으로 지정해야 합니다.

네, 자기성찰로 할 수 있어요.다음과 같은 GraphQL 쿼리를 만듭니다(유형 UserType의 경우).

{
   __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 쿼리를 동적으로 작성하여 이러한 모든 필드의 값을 가져올 수 있습니다.

이것은 취득할 필드의 이름을 알고 있는 것에 의존합니다.유형을 모를 경우 다음과 같은 자기성찰을 사용하여 모든 유형과 필드를 통합할 수 있습니다.

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

메모: 이것은 무선 GraphQL 데이터입니다.실제 클라이언트와 함께 읽고 쓰는 방법을 스스로 결정합니다.graphQL javascript 라이브러리는 이미 일부 용량에서 Introspection을 사용하고 있을 수 있습니다.예를 들어 apollo codegen 명령어는 Introspection을 사용하여 유형을 생성합니다.

20222 갱신

이 답변은 원래 작성되었으므로 이제 프로덕션에서 자기성찰 기능을 해제하는 것이 좋습니다.레퍼런스:프로덕션에서 graphql Introspection을 사용하지 않도록 설정해야 하는 이유.

운영 환경에서 Introspection이 해제된 환경에서는 운영 환경에서 사용된 정적 쿼리를 생성하는 데 도움이 되는 방법으로 개발 중에 이 쿼리를 사용할 수 있습니다. 실제 운영 환경에서는 쿼리를 동적으로 생성할 수 없습니다.

이 작업을 수행하려면 재사용 가능한 조각을 활용하는 방법밖에 없습니다.

fragment UserFragment on Users {
    id
    username
    count
} 

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

Google Places API에서 데이터베이스에 시리얼화한 위치 데이터를 로드해야 할 때도 같은 문제에 직면했습니다.일반적으로 지도와 연동되도록 전체를 원하지만 매번 모든 필드를 지정할 필요는 없었습니다.

저는 Ruby에서 일하고 있었기 때문에 PHP 실장은 드릴 수 없지만 원칙은 동일합니다.

리터럴 JSON 객체를 반환하는 JSON이라는 커스텀스칼라 타입을 정의했습니다.

루비 실장은 이와 같았다(graphql-ruby 사용).

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의 오브젝트를 물리치는 것입니다.

GraphQL 쿼리 포맷은 다음 작업을 수행할 수 있도록 설계되었습니다.

  1. 쿼리와 결과 셰이프는 모두 동일합니다.
  2. 서버는 요청된 필드를 정확하게 인식하므로 클라이언트는 필수 데이터만 다운로드합니다.

단, GraphQL 매뉴얼에 따르면 선택 세트의 재사용성을 높이기 위해 fragment를 작성할 수 있습니다.

# Only most used selection properties

fragment UserDetails on User {
    id,
    username
} 

다음으로 모든 사용자 세부사항을 조회할 수 있습니다.

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

fragment와 함께 필드를 추가할 수도 있습니다.

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

패키지 graphql-type-json은 커스텀스칼라 타입의 JSON을 지원합니다.json 객체의 모든 필드를 표시할 수 있습니다.다음은 ApolloGraphql Server 예제 링크입니다.https://www.apollographql.com/docs/apollo-server/schema/scalars-enums/ # 커스텀 프로세서

이 문제는 하루 전에 게시한 프레임워크로 해결할 수 있습니다.

https://github.com/babyfish-ct/graphql-ts-client

긴 쿼리:

const employees = findEmployees(
    {}, 
    employee$.
    .id
    .firstName
    .lastName
    .gender
    .salary
    .subordinates(
        employee$.id
    )
)

짧은 쿼리(104$$ = employee$ + 모든 스칼라 필드):

const employees = findEmployees(
    {}, 
    employee$$.
    .subordinates(
        employee$.id
    )
)

언급URL : https://stackoverflow.com/questions/34199982/how-to-query-all-the-graphql-type-fields-without-writing-a-long-query

반응형