긴 쿼리를 쓰지 않고 모든 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 쿼리 포맷은 다음 작업을 수행할 수 있도록 설계되었습니다.
- 쿼리와 결과 셰이프는 모두 동일합니다.
- 서버는 요청된 필드를 정확하게 인식하므로 클라이언트는 필수 데이터만 다운로드합니다.
단, 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
'itsource' 카테고리의 다른 글
R에서 아포스트로피를 이스케이프하여 문자열을 MySQL 테이블에 삽입하려면 어떻게 해야 합니까? (0) | 2022.11.14 |
---|---|
MySQL foreign_key_checks는 데이터베이스 전체에 영향을 미칩니까? (0) | 2022.11.14 |
JavaScript: 위치.새 창/탭에서 여는 href를 선택하십시오. (0) | 2022.11.14 |
@ComponentScan 주석을 사용하여 여러 경로를 스캔하려면 어떻게 해야 합니까? (0) | 2022.11.14 |
레퍼런스 요건setuptools setup.py 파일의 install_displays kwarg에 대한 txt (0) | 2022.11.14 |