{"id":5599,"date":"2018-08-16T07:00:59","date_gmt":"2018-08-16T14:00:59","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=5599"},"modified":"2025-06-13T21:28:53","modified_gmt":"2025-06-14T04:28:53","slug":"create-graphql-api-php-nosql","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/create-graphql-api-php-nosql\/","title":{"rendered":"Crear una API potenciada por GraphQL con PHP y NoSQL"},"content":{"rendered":"<p>Si has estado al d\u00eda, sabr\u00e1s que he estado escribiendo una especie de mega serie sobre el desarrollo con <a href=\"https:\/\/graphql.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">GraphQL<\/a> y Couchbase. En tutoriales anteriores hemos explorado <a href=\"https:\/\/www.couchbase.com\/blog\/es\/processing-graphql-queries-with-java-spring-boot-and-nosql\/\" target=\"_blank\" rel=\"noopener noreferrer\">c\u00f3mo utilizar GraphQL con Java<\/a>, <a href=\"https:\/\/www.couchbase.com\/blog\/es\/creating-a-graphql-application-with-node-js-and-a-nosql-database\/\" target=\"_blank\" rel=\"noopener noreferrer\">c\u00f3mo utilizar GraphQL con Node.js<\/a>y <a href=\"https:\/\/www.couchbase.com\/blog\/es\/using-graphql-with-golang-and-a-nosql-database\/\" target=\"_blank\" rel=\"noopener noreferrer\">c\u00f3mo utilizar GraphQL con Golang<\/a>.<\/p>\n<p>Despu\u00e9s de haber producido contenido en torno a todos esos lenguajes, alguien de mi equipo me pregunt\u00f3 qu\u00e9 lugar ocupaba PHP en la mezcla. De ese comentario surgi\u00f3 este tutorial sobre la creaci\u00f3n de una API con GraphQL y PHP usando <a href=\"https:\/\/www.couchbase.com\/blog\/es\/\" target=\"_blank\" rel=\"noopener noreferrer\">Couchbase<\/a> NoSQL como <a href=\"https:\/\/www.couchbase.com\/blog\/es\/resources\/concepts\/data-platforms\/\">capa de datos<\/a>.<\/p>\n<p><!--more--><\/p>\n<p>Antes de invertir demasiado en este tutorial de GraphQL PHP y NoSQL, hay algunas suposiciones que deben cumplirse:<\/p>\n<ol>\n<li>Couchbase debe estar ya instalado y configurado.<\/li>\n<li>PHP debe estar instalado y configurado.<\/li>\n<li>Composer y PECL deben estar disponibles para descargar las dependencias del proyecto PHP.<\/li>\n<\/ol>\n<p>Suponiendo que se cumplen las condiciones anteriores, podemos proceder a desarrollar nuestra aplicaci\u00f3n.<\/p>\n<h2>Creaci\u00f3n de un nuevo proyecto con dependencias GraphQL y Couchbase para PHP<\/h2>\n<p>El primer paso hacia el \u00e9xito de nuestro proyecto es crear uno y descargar las dependencias necesarias. En alg\u00fan lugar de tu ordenador, crea un nuevo directorio e incluye un archivo\u00a0<strong>graphql.php<\/strong> archivo. Utilizando su s\u00edmbolo del sistema dentro de este directorio, ejecute lo siguiente:<\/p>\n<pre class=\"lang:default decode:true\">composer require webonyx\/graphql-php<\/pre>\n<p>El comando anterior instalar\u00e1 nuestra dependencia GraphQL que hace todo el trabajo pesado para nuestra API. A continuaci\u00f3n, ejecute el siguiente comando desde el s\u00edmbolo del sistema:<\/p>\n<pre class=\"lang:default decode:true\">pecl install couchbase<\/pre>\n<p>El comando anterior instalar\u00e1 el SDK PHP de Couchbase. Reiterando mis suposiciones anteriores, necesitas tener <a href=\"https:\/\/getcomposer.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">Compositor<\/a> y <a href=\"https:\/\/pecl.php.net\/\" target=\"_blank\" rel=\"noopener noreferrer\">PECL<\/a> a su disposici\u00f3n.<\/p>\n<p>M\u00e1s informaci\u00f3n <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/sdk\/php\/start-using-sdk.html\" target=\"_blank\" rel=\"noopener noreferrer\">SDK PHP de Couchbase<\/a> y el <a href=\"https:\/\/webonyx.github.io\/graphql-php\/getting-started\/\" target=\"_blank\" rel=\"noopener noreferrer\">Paquete GraphQL<\/a> pueden encontrarse en cada una de sus respectivas documentaciones.<\/p>\n<h2>Configuraci\u00f3n del proyecto para el desarrollo de GraphQL y Couchbase<\/h2>\n<p>Con el proyecto creado y las dependencias descargadas, podemos trabajar para arrancar nuestra aplicaci\u00f3n. Abra el archivo\u00a0<strong>graphql.php<\/strong> e incluya lo siguiente:<\/p>\n<pre class=\"lang:default decode:true\">nombredeusuario('ejemplo')-&gt;contrase\u00f1a('123456');\r\n$cluster-&gt;authenticate($authenticator);\r\n$bucket = $cluster-&gt;openBucket('ejemplo');\r\n\r\nheader('Content-Type: application\/json');\r\n\r\n?&gt;<\/pre>\n<p>En el c\u00f3digo anterior estamos haciendo referencia a nuestra dependencia Composer e incluyendo algunas de las clases GraphQL que planeamos utilizar. Sin llegar a configurar GraphQL o utilizar nuestra base de datos, necesitamos establecer una conexi\u00f3n con nuestra base de datos.<\/p>\n<p>Mi aplicaci\u00f3n PHP se ejecutaba localmente junto a mi instancia de Couchbase. Aseg\u00farate de rellenar los huecos cuando se trate de tu propia informaci\u00f3n de conexi\u00f3n a Couchbase.<\/p>\n<h2>Definici\u00f3n de objetos GraphQL para la gesti\u00f3n de datos<\/h2>\n<p>Ahora podemos centrarnos en definir nuestro modelo de datos, tambi\u00e9n conocido como objetos GraphQL dentro de nuestra API. Para este ejemplo en particular vamos a hacer referencia a los datos de Pokemon. Por esta raz\u00f3n podr\u00edamos tener informaci\u00f3n sobre un Pokemon en particular, qu\u00e9 movimientos tiene, o en qu\u00e9 videojuego se encuentra. Esta ser\u00e1 la base de nuestro modelo de datos.<\/p>\n<p>Empecemos con lo siguiente en nuestro\u00a0<strong>graphql.php<\/strong> utilizando este ejemplo:<\/p>\n<pre class=\"lang:default decode:true\">$moveType = new ObjectType([\r\n    'name' =&gt; 'Move',\r\n    'fields' =&gt; [\r\n        'name' =&gt; [ 'type' =&gt; Type::string() ],\r\n        'tipo' =&gt; [ 'tipo' =&gt; Type::string() ],\r\n        'power' =&gt; [ 'type' =&gt; Type::int() ],\r\n    ],\r\n]);\r\n\r\n$pokemonType = new ObjectType([\r\n    'name' =&gt; 'Pokemon',\r\n    'fields' =&gt; [\r\n        'nombre' =&gt; [ 'tipo' =&gt; Type::string() ],\r\n        'peso' =&gt; [ 'tipo' =&gt; Type::int() ],\r\n        'height' =&gt; [ 'type' =&gt; Type::int() ],\r\n        'atributos' =&gt; [ 'tipo' =&gt; Type::listOf(Type::string()) ],\r\n        'moves' =&gt; [ 'type' =&gt; Type::listOf($moveType) ],\r\n    ],\r\n]);<\/pre>\n<p>En el c\u00f3digo anterior tenemos dos objetos con las posibles propiedades JSON, tambi\u00e9n llamadas campos. Para el <code>$pokemonTipo<\/code> tenemos un campo que hace referencia a nuestro otro objeto. La direcci\u00f3n <code>listOf<\/code> significa que podemos esperar que se devuelva un array de datos.<\/p>\n<p>Los dos objetos que tenemos distan mucho de ser todo lo complejos que podr\u00edan ser, pero sirven de ejemplo realista. Sin embargo, por ahora no son m\u00e1s que un modelo. Necesitamos poder rellenarlos con datos reales de nuestra base de datos.<\/p>\n<h2>Desarrollo de consultas para rellenar objetos GraphQL<\/h2>\n<p>El siguiente paso es idear las consultas a ejecutar contra nuestra base de datos que llenar\u00e1n nuestros objetos GraphQL. Esto se hace a trav\u00e9s de consultas, que al fin y al cabo no es m\u00e1s que otro objeto GraphQL que contiene l\u00f3gica.<\/p>\n<p>Tomemos como ejemplo el siguiente c\u00f3digo:<\/p>\n<pre class=\"lang:default decode:true\">$queryType = new ObjectType([\r\n    'name' =&gt; 'Consulta',\r\n    'fields' =&gt; [\r\n        'pokemons' =&gt; [\r\n            'type' =&gt; Type::listOf($pokemonType),\r\n            'resolve' =&gt; function ($root, $args) {\r\n                global $bucket;\r\n                $query = CouchbaseN1qlQuery::fromString(\"SELECT ejemplo.* FROM ejemplo WHERE tipo = 'pokemon'\");\r\n                $result = $bucket-&gt;query($query);\r\n                return $result-&gt;rows;\r\n            }\r\n        ],\r\n        'pokemon' =&gt; [\r\n            'type' =&gt; $pokemonType,\r\n            'args' =&gt; [\r\n                'id' =&gt; Type::nonNull(Type::string()),\r\n            ],\r\n            'resolve' =&gt; function ($root, $args) {\r\n                global $bucket;\r\n                $result = $bucket-&gt;get(\"pokemon-\" . $args['id']);\r\n                return $result-&gt;valor;\r\n            }\r\n        ],\r\n    ],\r\n]);<\/pre>\n<p>El c\u00f3digo anterior, que terminar\u00eda en su\u00a0<strong>graphql.php<\/strong> tiene dos posibilidades de consulta. La primera consulta se llama <code>pokemons<\/code> devolver\u00e1 una matriz con los valores <code>$pokemonTipo<\/code> modelo. El sitio <code>resolver<\/code> es lo que realmente ejecuta la l\u00f3gica. La l\u00f3gica para <code>pokemons<\/code> ejecutar\u00e1 una consulta N1QL en Couchbase y devolver\u00e1 el resultado. El resultado de la consulta N1QL se asigna a cada uno de los campos definidos en nuestro objeto GraphQL.<\/p>\n<p>Ejecuci\u00f3n de la <code>pokemons<\/code> podr\u00eda ser algo parecido a esto:<\/p>\n<pre class=\"lang:default decode:true\">curl https:\/\/localhost:8080 -d '{\"query\": \"query { pokemons{ nombre, altura, atributos } }\" }'<\/pre>\n<p>En <code>pokemon<\/code> es similar, pero no igual. En la <code>pokemon<\/code> requerimos una <code>id<\/code> se apruebe. Este <code>id<\/code> se utiliza para realizar una b\u00fasqueda directa de un documento NoSQL concreto en lugar de una consulta NoSQL.<\/p>\n<p>En <code>pokemon<\/code> podr\u00eda ser algo parecido a esto:<\/p>\n<pre class=\"lang:default decode:true\">curl https:\/\/localhost:8080 -d '{\"query\": \"query { pokemon(id: \\\"25\\\"){ nombre, altura, atributos } }\" }'<\/pre>\n<p>El resultado de esta consulta ser\u00e1 un \u00fanico objeto en lugar de una matriz.<\/p>\n<h2>Manejo simplista de las relaciones entre modelos<\/h2>\n<p>Ahora digamos que queremos alg\u00fan tipo de relaci\u00f3n de datos. Hasta ahora hemos asumido que los datos de movimiento y los datos Pokemon existen en el mismo documento, pero \u00bfqu\u00e9 pasar\u00eda si tuvi\u00e9ramos datos que estuvieran divididos, pero relacionados?<\/p>\n<p>Existen dos enfoques al respecto:<\/p>\n<ol>\n<li>Podemos hacer una consulta JOIN haciendo consultas potencialmente m\u00e1s complejas de gestionar.<\/li>\n<li>Podemos modular las consultas por campos para que sean peque\u00f1as y sencillas.<\/li>\n<\/ol>\n<p>Si has tenido la oportunidad de escuchar mi podcast titulado <a href=\"https:\/\/www.thepolyglotdeveloper.com\/2018\/08\/tpdp-e20-graphql-api-development\/\" target=\"_blank\" rel=\"noopener noreferrer\">GraphQL para el desarrollo de API<\/a> en el que aparec\u00eda el co-creador de GraphQL Lee Byron, sabr\u00e1s que ninguna de las dos es err\u00f3nea y que todo se reduce a las preferencias. Echemos un vistazo a esta \u00faltima, en la que modularizamos las consultas y los objetos GraphQL.<\/p>\n<p>Digamos que ahora queremos incluir datos del juego y es un objeto separado como este:<\/p>\n<pre class=\"lang:default decode:true\">$gameType = new ObjectType([\r\n    'name' =&gt; 'Juego',\r\n    'fields' =&gt; [\r\n        'name' =&gt; [ 'type' =&gt; Type::string() ],\r\n    ],\r\n]);<\/pre>\n<p>Ahora digamos que nuestros documentos Pokemon en nuestra base de datos contienen un id de juego, pero no los datos reales. Similar a una relaci\u00f3n de clave primaria y for\u00e1nea, pero no realmente porque esto es NoSQL.<\/p>\n<p>Lo que podr\u00edamos hacer ahora es lo siguiente:<\/p>\n<pre class=\"lang:default decode:true\">$pokemonType = new ObjectType([\r\n    'name' =&gt; 'Pokemon',\r\n    'fields' =&gt; [\r\n        'nombre' =&gt; [ 'tipo' =&gt; Type::string() ],\r\n        'peso' =&gt; [ 'tipo' =&gt; Type::int() ],\r\n        'height' =&gt; [ 'type' =&gt; Type::int() ],\r\n        'atributos' =&gt; [ 'tipo' =&gt; Type::listOf(Type::string()) ],\r\n        'moves' =&gt; [ 'type' =&gt; Type::listOf($moveType) ],\r\n        'juego' =&gt; [\r\n            'type' =&gt; $gameType,\r\n            'resolve' =&gt; function ($root, $args) {\r\n                global $bucket;\r\n                $result = $bucket-&gt;get($root-&gt;game);\r\n                return $result-&gt;valor;\r\n            }\r\n        ],\r\n    ],\r\n]);<\/pre>\n<p>Observe que hemos cambiado nuestro <code>$pokemonTipo<\/code> para incluir un campo de juego, pero este campo tiene su propio <code>resolver<\/code> funci\u00f3n. Dentro de esta <code>resolver<\/code> podemos acceder a la funci\u00f3n padre o <code>$root<\/code> que contiene un identificador de juego, porque eso es lo que nuestro <code>pokemon<\/code> y <code>pokemons<\/code> nos dio. Usando el id, podemos obtener los datos del juego que existen en un documento separado y devolverlos.<\/p>\n<p>Ahora nuestro <code>pokemons<\/code> se salva de una sentencia JOIN. No estoy diciendo que una sentencia JOIN sea mala, pero imag\u00ednese si tuviera algunos modelos de datos salvajes que requirieran una consulta de 50 l\u00edneas. En esos casos podr\u00eda tener sentido dividirla en lugar de intentar mantener una consulta masiva. Como dato curioso, la operaci\u00f3n de juego en la base de datos no se llamar\u00e1 a menos que el campo de juego se solicite en una sentencia <a href=\"https:\/\/www.couchbase.com\/blog\/es\/processing-graphql-queries-with-java-spring-boot-and-nosql\/\">Consulta GraphQL<\/a> desde el frontend.<\/p>\n<h2>Integraci\u00f3n de la aplicaci\u00f3n<\/h2>\n<p>Es hora de unir la aplicaci\u00f3n. Hasta ahora solo hemos visto los modelos de datos y las consultas, pero no la hemos configurado para usarla con GraphQL.<\/p>\n<p>Eche un vistazo al c\u00f3digo ahora completo:<\/p>\n<pre class=\"lang:default decode:true\">nombredeusuario('ejemplo')-&gt;contrase\u00f1a('123456');\r\n$cluster-&gt;authenticate($authenticator);\r\n$bucket = $cluster-&gt;openBucket('ejemplo');\r\n\r\n$gameType = new ObjectType([\r\n    'name' =&gt; 'Juego',\r\n    'fields' =&gt; [\r\n        'name' =&gt; [ 'type' =&gt; Type::string() ],\r\n    ],\r\n]);\r\n\r\n$moveType = new ObjectType([\r\n    'name' =&gt; 'Move',\r\n    'fields' =&gt; [\r\n        'name' =&gt; [ 'type' =&gt; Type::string() ],\r\n        'tipo' =&gt; [ 'tipo' =&gt; Type::string() ],\r\n        'power' =&gt; [ 'type' =&gt; Type::int() ],\r\n    ],\r\n]);\r\n\r\n$pokemonType = new ObjectType([\r\n    'name' =&gt; 'Pokemon',\r\n    'fields' =&gt; [\r\n        'nombre' =&gt; [ 'tipo' =&gt; Type::string() ],\r\n        'peso' =&gt; [ 'tipo' =&gt; Type::int() ],\r\n        'height' =&gt; [ 'type' =&gt; Type::int() ],\r\n        'atributos' =&gt; [ 'tipo' =&gt; Type::listOf(Type::string()) ],\r\n        'moves' =&gt; [ 'type' =&gt; Type::listOf($moveType) ],\r\n        'juego' =&gt; [\r\n            'type' =&gt; $gameType,\r\n            'resolve' =&gt; function ($root, $args) {\r\n                global $bucket;\r\n                $result = $bucket-&gt;get($root-&gt;game);\r\n                return $result-&gt;valor;\r\n            }\r\n        ],\r\n    ],\r\n]);\r\n\r\n$queryType = new ObjectType([\r\n    'name' =&gt; 'Consulta',\r\n    'fields' =&gt; [\r\n        'pokemons' =&gt; [\r\n            'type' =&gt; Type::listOf($pokemonType),\r\n            'resolve' =&gt; function ($root, $args) {\r\n                global $bucket;\r\n                $query = CouchbaseN1qlQuery::fromString(\"SELECT ejemplo.* FROM ejemplo WHERE tipo = 'pokemon'\");\r\n                $result = $bucket-&gt;query($query);\r\n                return $result-&gt;rows;\r\n            }\r\n        ],\r\n        'pokemon' =&gt; [\r\n            'type' =&gt; $pokemonType,\r\n            'args' =&gt; [\r\n                'id' =&gt; Type::nonNull(Type::string()),\r\n            ],\r\n            'resolve' =&gt; function ($root, $args) {\r\n                global $bucket;\r\n                $result = $bucket-&gt;get(\"pokemon-\" . $args['id']);\r\n                return $result-&gt;valor;\r\n            }\r\n        ],\r\n    ],\r\n]);\r\n\r\n$schema = nuevo Schema([\r\n    'query' =&gt; $queryType\r\n]);\r\n\r\n$rawInput = file_get_contents('php:\/\/input');\r\n$input = json_decode($rawInput, true);\r\n$query = $input['query'];\r\n$variableValues = isset($input['variables']) ? $input['variables'] : null;\r\n\r\ntry {\r\n    $result = GraphQL::executeQuery($schema, $query, null, null, $variableValues);\r\n    $output = $result-&gt;toArray();\r\n} catch (\\Exception $e) {\r\n    $output = [\r\n        errores' =&gt; [\r\n            [\r\n                'message' =&gt; $e-&gt;getMessage()\r\n            ]\r\n        ]\r\n    ];\r\n}\r\n\r\nheader('Content-Type: application\/json');\r\necho json_encode($output);\r\n\r\n?&gt;<\/pre>\n<p>La mitad inferior del c\u00f3digo se ha extra\u00eddo del archivo <a href=\"https:\/\/webonyx.github.io\/graphql-php\/getting-started\/\" target=\"_blank\" rel=\"noopener noreferrer\">Documentaci\u00f3n oficial del servidor PHP GraphQL<\/a>. Esencialmente, estamos definiendo nuestras consultas como el esquema y tomando cualquier entrada del usuario final. Esta entrada se utiliza en combinaci\u00f3n con el esquema para producir un resultado que se devuelve al usuario.<\/p>\n<h2>Conclusi\u00f3n<\/h2>\n<p>Acaba de ver c\u00f3mo crear una API GraphQL con PHP y <a href=\"https:\/\/www.couchbase.com\/blog\/es\/\" target=\"_blank\" rel=\"noopener noreferrer\">Couchbase<\/a> como base de datos NoSQL. GraphQL es una gran alternativa a escribir APIs RESTful porque permite mantener adecuadamente un modelo de datos que puede ser consultado a trav\u00e9s de un frontend. Esto reduce la cantidad de solicitudes HTTP, as\u00ed como la carga \u00fatil devuelta en cualquier solicitud.<\/p>\n<p>Si desea obtener m\u00e1s informaci\u00f3n sobre el uso de Couchbase con PHP, echa un vistazo a un tutorial anterior que escrib\u00ed titulado,\u00a0<a href=\"https:\/\/www.couchbase.com\/blog\/es\/getting-started-nosql-using-couchbase-server-php\/\" target=\"_blank\" rel=\"noopener noreferrer\">Primeros pasos con NoSQL usando Couchbase Server y PHP<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>If you&#8217;ve been keeping up, you&#8217;ll know that I&#8217;ve been writing a sort-of mega series around developing with GraphQL and Couchbase. In past tutorials we&#8217;ve explored how to use GraphQL with Java, how to use GraphQL with Node.js, and how [&hellip;]<\/p>","protected":false},"author":63,"featured_media":5600,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1814,1815,9408],"tags":[1393,2210,1725,1745],"ppma_author":[9032],"class_list":["post-5599","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-application-design","category-best-practices-and-tutorials","category-php","tag-api","tag-graphql","tag-nosql-database","tag-restful"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.0 (Yoast SEO v26.0) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>GraphQL-Powered API with PHP and NoSQL: Tutorial + Examples<\/title>\n<meta name=\"description\" content=\"Need to create a new project with GraphQL and Couchbase Dependencies for PHP. Use an API with GraphQL and PHP using Couchbase NoSQL as the data layer.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/es\/create-graphql-api-php-nosql\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Create a GraphQL-Powered API with PHP and NoSQL\" \/>\n<meta property=\"og:description\" content=\"Need to create a new project with GraphQL and Couchbase Dependencies for PHP. Use an API with GraphQL and PHP using Couchbase NoSQL as the data layer.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/create-graphql-api-php-nosql\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/thepolyglotdeveloper\" \/>\n<meta property=\"article:published_time\" content=\"2018-08-16T14:00:59+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T04:28:53+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/background-3045402_1920.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"1080\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Nic Raboy, Developer Advocate, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@nraboy\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Nic Raboy, Developer Advocate, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/\"},\"author\":{\"name\":\"Nic Raboy, Developer Advocate, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1\"},\"headline\":\"Create a GraphQL-Powered API with PHP and NoSQL\",\"datePublished\":\"2018-08-16T14:00:59+00:00\",\"dateModified\":\"2025-06-14T04:28:53+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/\"},\"wordCount\":1263,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/background-3045402_1920.png\",\"keywords\":[\"API\",\"graphql\",\"NoSQL Database\",\"restful\"],\"articleSection\":[\"Application Design\",\"Best Practices and Tutorials\",\"PHP\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/\",\"name\":\"GraphQL-Powered API with PHP and NoSQL: Tutorial + Examples\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/background-3045402_1920.png\",\"datePublished\":\"2018-08-16T14:00:59+00:00\",\"dateModified\":\"2025-06-14T04:28:53+00:00\",\"description\":\"Need to create a new project with GraphQL and Couchbase Dependencies for PHP. Use an API with GraphQL and PHP using Couchbase NoSQL as the data layer.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/background-3045402_1920.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/background-3045402_1920.png\",\"width\":1920,\"height\":1080},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Create a GraphQL-Powered API with PHP and NoSQL\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1\",\"name\":\"Nic Raboy, Developer Advocate, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/8863514d8bed0cf6080f23db40e00354\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g\",\"caption\":\"Nic Raboy, Developer Advocate, Couchbase\"},\"description\":\"Nic Raboy is an advocate of modern web and mobile development technologies. He has experience in Java, JavaScript, Golang and a variety of frameworks such as Angular, NativeScript, and Apache Cordova. Nic writes about his development experiences related to making web and mobile development easier to understand.\",\"sameAs\":[\"https:\/\/www.thepolyglotdeveloper.com\",\"https:\/\/www.facebook.com\/thepolyglotdeveloper\",\"https:\/\/x.com\/nraboy\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/nic-raboy-2\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"GraphQL-Powered API with PHP and NoSQL: Tutorial + Examples","description":"Necesidad de crear un nuevo proyecto con GraphQL y Couchbase Dependencias para PHP. Utilizar una API con GraphQL y PHP usando Couchbase NoSQL como capa de datos.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/es\/create-graphql-api-php-nosql\/","og_locale":"es_MX","og_type":"article","og_title":"Create a GraphQL-Powered API with PHP and NoSQL","og_description":"Need to create a new project with GraphQL and Couchbase Dependencies for PHP. Use an API with GraphQL and PHP using Couchbase NoSQL as the data layer.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/create-graphql-api-php-nosql\/","og_site_name":"The Couchbase Blog","article_author":"https:\/\/www.facebook.com\/thepolyglotdeveloper","article_published_time":"2018-08-16T14:00:59+00:00","article_modified_time":"2025-06-14T04:28:53+00:00","og_image":[{"width":1920,"height":1080,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/background-3045402_1920.png","type":"image\/png"}],"author":"Nic Raboy, Developer Advocate, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@nraboy","twitter_misc":{"Written by":"Nic Raboy, Developer Advocate, Couchbase","Est. reading time":"6 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/"},"author":{"name":"Nic Raboy, Developer Advocate, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1"},"headline":"Create a GraphQL-Powered API with PHP and NoSQL","datePublished":"2018-08-16T14:00:59+00:00","dateModified":"2025-06-14T04:28:53+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/"},"wordCount":1263,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/background-3045402_1920.png","keywords":["API","graphql","NoSQL Database","restful"],"articleSection":["Application Design","Best Practices and Tutorials","PHP"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/","url":"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/","name":"GraphQL-Powered API with PHP and NoSQL: Tutorial + Examples","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/background-3045402_1920.png","datePublished":"2018-08-16T14:00:59+00:00","dateModified":"2025-06-14T04:28:53+00:00","description":"Necesidad de crear un nuevo proyecto con GraphQL y Couchbase Dependencias para PHP. Utilizar una API con GraphQL y PHP usando Couchbase NoSQL como capa de datos.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/background-3045402_1920.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/background-3045402_1920.png","width":1920,"height":1080},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Create a GraphQL-Powered API with PHP and NoSQL"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"El blog de Couchbase","description":"Couchbase, la base de datos NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1","name":"Nic Raboy, Defensor del Desarrollador, Couchbase","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/8863514d8bed0cf6080f23db40e00354","url":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","caption":"Nic Raboy, Developer Advocate, Couchbase"},"description":"Nic Raboy es un defensor de las tecnolog\u00edas modernas de desarrollo web y m\u00f3vil. Tiene experiencia en Java, JavaScript, Golang y una variedad de frameworks como Angular, NativeScript y Apache Cordova. Nic escribe sobre sus experiencias de desarrollo relacionadas con hacer el desarrollo web y m\u00f3vil m\u00e1s f\u00e1cil de entender.","sameAs":["https:\/\/www.thepolyglotdeveloper.com","https:\/\/www.facebook.com\/thepolyglotdeveloper","https:\/\/x.com\/nraboy"],"url":"https:\/\/www.couchbase.com\/blog\/es\/author\/nic-raboy-2\/"}]}},"authors":[{"term_id":9032,"user_id":63,"is_guest":0,"slug":"nic-raboy-2","display_name":"Nic Raboy, Developer Advocate, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","author_category":"","last_name":"Raboy","first_name":"Nic","job_title":"","user_url":"https:\/\/www.thepolyglotdeveloper.com","description":"Nic Raboy es un defensor de las tecnolog\u00edas modernas de desarrollo web y m\u00f3vil. Tiene experiencia en Java, JavaScript, Golang y una variedad de frameworks como Angular, NativeScript y Apache Cordova. Nic escribe sobre sus experiencias de desarrollo relacionadas con hacer el desarrollo web y m\u00f3vil m\u00e1s f\u00e1cil de entender."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/5599","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/63"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=5599"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/5599\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/5600"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=5599"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=5599"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=5599"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=5599"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}