[php] 긴 쿼리를 작성하지 않고 모든 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에서 이것을 수행하는 방법이 있습니까?

내가 사용하고 Folkloreatelier / laravel-graphql 라이브러리를.



답변

불행히도 당신이 원하는 것은 불가능합니다. GraphQL에서는 쿼리에서 반환 할 필드를 명시 적으로 지정해야합니다.


답변

예, introspection을 사용하여 수행 할 수 있습니다. . 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을 사용하여 유형을 생성합니다.


답변

이 작업을 수행하는 유일한 방법은 재사용 가능한 조각을 사용하는 것입니다.

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 문서 에 따르면 선택 세트를 더 재사용하기 위해 조각 을 만들 수 있습니다 .

# Only most used selection properties

fragment UserDetails on User {
    id,
    username
} 

그런 다음 다음을 통해 모든 사용자 세부 정보를 쿼리 할 수 ​​있습니다.

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

조각과 함께 추가 필드를 추가 할 수도 있습니다 .

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/#custom-scalars


답변