Я создал мутацию, которая вставляет некоторые записи в базу данных, я хотел бы передать результат через соответствующий преобразователь типов, чтобы результат форматировался (клиент ожидает случай верблюда), а также клиент мог бы запрашивать вложенныеданные, если таковые имеются.
Я использую laravel + обертку для graphql ( ребинг )
Моя мутация выглядит следующим образом:
class CreateIngressedAccountsMutation extends Mutation
{
protected $attributes = [
'name' => 'createIngressedAccounts'
];
public function type(): Type
{
return Type::nonNull(Type::listOf(GraphQL::type('IngressedAccount')));
}
public function args(): array
{
return [
'accounts' => ['type' => Type::nonNull(Type::listOf(GraphQL::type('CreateIngressedAccountInput')))]
];
}
public function resolve($root, $args, $context, ResolveInfo $resolveInfo, Closure $getSelectFields)
{
$accounts = collect($args['accounts']);
return DB::transaction(function () use ($accounts) {
return $accounts->map(function ($accountInput) {
$account = (new IngressedAccount())->fill($accountInput));
$account->saveOrFail();
// some logic
// ...
// the client expects camel case, so I have to manually include the properties,
// the IngressedAccountType does it through alias
$account['createdBy'] = $account->created_by;
$account['createdAt'] = $account->created_at;
$account['updatedAt'] = $account->updated_at;
return $account;
});
});
return $result;
}
}
Мой IngressedAccountType выглядит следующим образом:
class IngressedAccountType extends GraphQLType
{
protected $attributes = ['name' => 'IngressedAccount',];
public function fields(): array
{
return [
'id' => ['type' => Type::nonNull(Type::id())],
'visitId' => ['type' => Type::nonNull(Type::id()), 'alias' => 'visit_id'],
'createdBy' => ['type' => Type::nonNull(Type::id())],
'name' => ['type' => Type::nonNull(Type::string())],
'type' => ['type' => Type::nonNull(Type::string())],
'geolocation' => ['type' => Type::nonNull(Type::string())],
'createdAt' => ['type' => Type::nonNull(Type::string()), 'alias' => 'created_at'],
'updatedAt' => ['type' => Type::string(), 'alias' => 'updated_at'],
'visit' => ['type' => Type::nonNull(GraphQL::type('User'))],
'comments' => ['type' => Type::nonNull(Type::listOf(Type::nonNull(GraphQL::type('Comment'))))]
];
}
protected function resolveCommentsField($root, $args)
{
return Comment::query()->where('entity_id', $root->id)->where('entity_name', 'ingressed_account')->get();
}
}