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 쿼리 형식 은 다음을 허용하도록 설계되었습니다.
- 쿼리와 결과 모양이 모두 똑같습니다. 합니다.
- 서버는 요청 된 필드를 정확히 알고 있으므로 클라이언트 는 필수 데이터 만 다운로드 합니다 .
그러나 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