Предположим, у вас есть тип 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 .
php
laravel
graphql
graphql-php
BlackSigma
источник
источник
Ответы:
К сожалению, то, что вы хотели бы сделать, невозможно. GraphQL требует, чтобы вы четко указали, какие поля вы хотите вернуть из вашего запроса.
источник
Да, вы можете сделать это с помощью самоанализа . Сделайте запрос GraphQL, например (для типа UserType )
и вы получите ответ вроде (фактические имена полей будут зависеть от вашего фактического определения схемы / типа)
Затем вы можете прочитать этот список полей в своем клиенте и динамически построить второй запрос GraphQL, чтобы получить все эти поля.
Это зависит от того, знаете ли вы имя типа, для которого хотите получить поля - если вы не знаете тип, вы можете собрать все типы и поля вместе, используя самоанализ, например
ПРИМЕЧАНИЕ: это данные GraphQL, передаваемые по сети - вы сами решаете, как читать и писать с помощью вашего реального клиента. Ваша библиотека javascript graphQL может уже использовать интроспекцию в некоторой степени, например, команда apollo codegen использует интроспекцию для генерации типов.
источник
Думаю, единственный способ сделать это - использовать многократно используемые фрагменты:
источник
Я столкнулся с той же проблемой, когда мне нужно было загрузить данные о местоположении, которые я сериализовал в базу данных из API Google Places. Как правило, я бы хотел, чтобы все это работало с картами, но мне не хотелось каждый раз указывать все поля.
Я работал с Ruby, поэтому не могу дать вам реализацию PHP, но принцип должен быть таким же.
Я определил настраиваемый скалярный тип JSON, который просто возвращает буквальный объект JSON.
Реализация ruby была такой (с использованием graphql-ruby)
Затем я использовал его для наших объектов вот так
Я бы использовал это очень экономно, используя его только там, где вы знаете, что вам всегда нужен весь объект JSON (как я сделал в моем случае). В противном случае это побеждает объект GraphQL в более общем смысле.
источник
{"en": "Hello", "es": "Hola"}
. А поскольку каждый пользователь может реализовать собственное подмножество языков для своего варианта использования, пользовательский интерфейс не имеет смысла запрашивать каждое возможное подмножество. Ваш пример отлично работает.Формат запроса GraphQL был разработан для того, чтобы позволить:
Однако, согласно документации GraphQL , вы можете создавать фрагменты , чтобы сделать наборы выбора более повторно используемыми:
Затем вы можете запросить все сведения о пользователе:
Вы также можете добавить дополнительные поля рядом с вашим фрагментом :
источник
Пакет graphql-type-json поддерживает пользовательские скаляры типа JSON. Используйте его, чтобы показать все поля ваших json-объектов. Вот ссылка на пример в ApolloGraphql Server. https://www.apollographql.com/docs/apollo-server/schema/scalars-enums/#custom-scalars
источник