es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo mapear un JSON en Lighthouse GraphQL para convertirlo en una respuesta de GraphQL.

No sé cómo preguntar, pero resumo lo que quiero hacer. Tengo un servidor Laravel con Lighthouse, no manejo bases de datos ni modelos, mi fuente de datos es una API que devuelve los datos en formato JSON, ahora mi pregunta es ¿cómo convierto o mapeo el JSON para una consulta GraphQL?

La estructura de mi JSON es más o menos así:

{
    "order" : 
    [
        {
            "details":
            {
              "id": "file",
              "value": "File"
            }
        },
        {
            "menu":
            {
              "menuitem":
              [
                {"value": "New", "onclick": "CreateDoc()"},
                {"value": "Open", "onclick": "OpenDoc()"},
                {"value": "Save", "onclick": "SaveDoc()"}
              ]
            }
        }
    ]
}

Y la estructura de mi esquema es algo así:

type order {
  details: details
  menu: menu
}

type details {
  id: String
  value: String
}

type menu {
  menuitem: menuitem
}

type menuitem {
  value: String
  onclick: String
}

type query {
  orders: [order]
}

La solución sería para el resolvedor personalizado, los modelos eloquent o algo más, si alguien pudiera guiarme, sería de gran ayuda.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para convertir o mapear el JSON para una consulta de GraphQL, puedes crear una función de resolución personalizada que obtenga los datos JSON de la API y los mapee al esquema de GraphQL.

    Primero, crea un esquema en tu archivo schema.graphql como se muestra en tu ejemplo. Luego, crea una función de resolución que mapee los datos JSON al esquema de GraphQL en OrderResolver.php.

    Aquí tienes un ejemplo de cómo podría verse el archivo OrderResolver.php:

    // OrderResolver.php
    
    namespace App\GraphQL\Resolvers;
    
    use GraphQL\Type\Definition\ResolveInfo;
    use Nuwave\Lighthouse\Support\Contracts\GraphQLContext;
    
    class OrderResolver
    {
        public function orders($rootValue, array $args, GraphQLContext $context, ResolveInfo $resolveInfo)
        {
            // Obtén los datos JSON de la API y decodifícalos
            $json = file_get_contents('https://example.com/api/orders');
            $data = json_decode($json);
    
            // Mapea los datos JSON para que coincidan con el esquema de GraphQL
            $orders = [];
            foreach ($data->order as $order) {
                $details = $order->details;
                $menuitem = $order->menu->menuitem;
    
                $orderObj = [
                    'details' => [
                        'id' => $details->id,
                        'value' => $details->value,
                    ],
                    'menu' => [
                        'menuitem' => [],
                    ],
                ];
                foreach ($menuitem as $item) {
                    $orderObj['menu']['menuitem'][] = [
                        'value' => $item->value,
                        'onclick' => $item->onclick,
                    ];
                }
    
                $orders[] = $orderObj;
            }
    
            return $orders;
        }
    }
    

    En este ejemplo, la función orders obtiene los datos JSON de la API y los mapea para que coincidan con el esquema de GraphQL. Esto se hace recorriendo cada objeto order en los datos JSON y creando un nuevo objeto que coincide con el tipo order en el esquema de GraphQL.

    Finalmente, puedes registrar el resolvedor en tu archivo de configuración graphql.php:

    // graphql.php
    
    use App\GraphQL\Resolvers\OrderResolver;
    
    return [
        // ...
    
        'resolvers' => [
            'Query' => [
                'orders' => [OrderResolver::class, 'orders'],
            ],
        ],
    ];
    

    Con esta configuración, deberías poder ejecutar consultas de GraphQL que obtengan datos de la API JSON utilizando tu función de resolución personalizada. Por ejemplo:

    query {
      orders {
        details {
          id
          value
        }
        menu {
          menuitem {
            value
            onclick
          }
        }
      }
    }
    

    Esto devolverá los datos JSON mapeados en el formato especificado por el esquema de GraphQL.

Comments are closed.