Onwuka Gideon es un desarrollador freelance full stack con años de experiencia diseñando y codificando aplicaciones web y resolviendo problemas complejos. Le encanta la seguridad, escribir y hablar de nuevas tecnologías.

Cuando se crean aplicaciones que manejan un gran número de documentos, es importante utilizar la paginación para obtener filas por página.
En este artículo, voy a demostrar cómo implementar la paginación cuando se trabaja con N1QL y PHP.
Un poco sobre N1QL
Couchbase N1QL es un lenguaje de consulta declarativo que extiende SQL para JSON. Puedes consultar datos a través de la integración nativa del framework y el lenguaje, una API fluida o los drivers JDBC/ODBC. N1QL ofrece a los desarrolladores un lenguaje expresivo, potente y completo para consultar y manipular datos.
Requisitos previos
- Conocimientos básicos de Couchbase y tenerlo configurado en su servidor (Instalación de Couchbase)
- Conocimientos básicos de N1QL
- Conocimientos básicos de PHP (opcional, ya que se puede utilizar cualquier lenguaje)
- Un SDK de Couchbase disponible (Ir aquí)
Qué construiríamos
Para el propósito de este artículo, configuraremos rápidamente un entorno PHP en el que básicamente extraeremos datos de la base de datos, paginaremos los datos y los mostraremos.
Configuración del entorno
Paso 1: crear un nuevo cubo
Accede a tu área de administración de Couchbase y crea un nuevo nombre de bucket comentarios.

Paso 2: crear un índice para el nuevo bucket: comentarios
Haz clic en la pestaña de consulta, inserta la consulta que aparece a continuación y haz clic en ejecutar.
|
1 |
create primary index on `commenting` using gsi; |
Si todo va bien, podemos empezar a crear documentos.
Paso 3: clonar el archivo de inicio del proyecto
He creado la estructura básica de los archivos que utilizaremos en este tutorial.
Abre tu línea de comandos y clona el repositorio de github.
|
1 |
$ git clone git@github.com:dongido001/php-couchbase-pagination_complete.git |
Ahora, abre el archivo que acabas de clonar en tu navegador. Deberías ver la siguiente página:

La estructura de los ficheros
El repositorio que acaba de clonar contiene 3 ficheros PHP: config.php, db.phpy index.php.
En config.php es donde definimos la información de nuestra base de datos:
|
1 2 3 4 5 6 |
<?php //some configs define("C_USERNAMAE", "Administrator"); define("C_PASSWORD", "password"); define("C_URL", "https://127.0.0.1:8091/"); //eg: localhost:8091 define("DEFAULT_BUCKET", "commenting"); |
En el db.phpNos conectamos a Couchbase y abrimos un bucket. Deberías cambiar los detalles para que se correspondan con tu información de Couchbase.
|
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php $authenticator = new \Couchbase\ClassicAuthenticator(); $authenticator->cluster(C_USERNAMAE, C_PASSWORD); $cluster = new \Couchbase\Cluster(C_URL); $cluster->authenticate($authenticator); $bucket = $cluster->openBucket(DEFAULT_BUCKET); In the `index.php`, we have some PHP code at the top of the file and at the bottom, we also |
tienen algo de código HTML.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
//index.php <?php //include config details require_once('config.php'); //include connection to the database. require_once('db.php'); if( $_SERVER['REQUEST_METHOD'] == "POST"){ $uid = uniqid(); $comment = [ "_id" => $uid, "name" => $_POST["name"], "comment" => $_POST["comment"], "created_at" => date("Y-m-d H:i:s") ]; $bucket->insert($uid, $comment); } ?> ... |
He incluido los dos archivos, config.php y db.php entonces escribí lógica para insertar algunos comentarios en la base de datos cuando se envía el formulario.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
//index.php ... <!DOCTYPE html> <html lang="en"> <head> <!-- Required meta tags --> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <!-- Bootstrap CSS --> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css" integrity="sha384-/Y6pD6FV/Vv2HJnA6t+vslU6fwYXjCFtcEpHbNJ0lyAFsXTsjBbfaDjzALeQsN6M" crossorigin="anonymous"> </head> <body> <div class="container"> <div class="container" style="margin-left: auto; margin-right: auto; width: 400px;"> <h4 class="text-center">Add a comment</h4> <form action="" method="POST"> <div class="form-group"> <label for="name">Name:</label> <input type="text" class="form-control" name="name" required> </div> <div class="form-group"> <label for="comment">Comment:</label> <textarea class="form-control" rows="5" name="comment" required> </textarea> </div> <button type="submit" class="btn btn-primary">Submit</button> </form> <br /> <div > <h4 class="text-center">Listing comments</h4> </div> <div id="pagination"> </div> </div> </div> </body> </html> |
El código HTML muestra un formulario para añadir y listar comentarios.
Empecemos.
Añade tantos comentarios de la página como quieras. En breve paginaremos esos datos.
Obtener contenido paginado en la base de datos
Añada lo siguiente a la parte de cabecera de index.php que está debajo de cada código PHP en la parte superior.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
//Select all contentin our query $no_per_page = 4; //This is the number of Items we want per page $current_page = (isset($_GET['page_id'])) ? $_GET['page_id'] : 1; //Gets the current page, if not set, default to page 1 $skip = ($current_page - 1) * $no_per_page; //Gets the total number of page we want to skip when making request. When we are on page one, We don't need to skip any Item. $query = \Couchbase\N1qlQuery::fromString("SELECT * FROM `commenting` LIMIT $no_per_page OFFSET $skip"); $result = $bucket->query($query); //count total number of result in the database $total = $bucket->query(\Couchbase\N1qlQuery::fromString("SELECT COUNT(comment) total FROM `commenting`")); $total = $total->rows[0]->total; $number_of_pages = ceil( $total/$no_per_page ); //calculate number of pages |
He añadido comentarios al código anterior, que describen lo que hace cada uno. Aquí también utilizamos LÍMITE Y OFFSET que nos permitió LIMITAR el número de resultados que debe devolver cada consulta. El OFFSET se utilizó para saltar una cantidad de datos al consultar dependiendo del número de página al que estamos accediendo en ese momento.
LÍMITE: La cláusula LIMIT especifica el número máximo de objetos que se pueden devolver en un conjunto de resultados mediante SELECT. Un valor negativo o un valor superior a 9223372036854775295 (resultado de 1 - 512) se considera LIMIT 0.
OFFSET: La cláusula OFFSET especifica un número de objetos que deben omitirse. Si también hay una cláusula LIMIT, el OFFSET se aplica antes que el LIMIT. El valor de OFFSET debe ser un número entero no negativo.
Introducir el resultado de la consulta en la página
Añada el código siguiente a index.php dentro de esta etiqueta, inmediatamente después de <h4 class="text-center">Comentarios</h4> .
|
1 2 3 4 5 6 7 8 9 10 |
<?php foreach( $result->rows as $comment ):?> <div> <div class="alert alert-success" role="alert"> <h5 class="alert-heading"> By: <?=$comment->commenting->name?>, Created At: <?=$comment->commenting->created_at?> </h5><br> <p> <?=$comment->commenting->comment?></p> <hr> </div> </div> <?php endforeach; ?> |
Añadir el enlace paginado
Añade el siguiente código entre esta etiqueta html <div id="pagination"> </div> en la parte inferior de index.php.
|
Aquí sólo estamos imprimiendo el número de páginas a la página.
Sí. Nuestra paginación ya funciona.

Conclusión
En este artículo, has aprendido cómo implementar la paginación utilizando N1QL. También hemos revisado OFFSET y LÍMITE y cómo básicamente ejecutar consultas en Couchbase usando N1QL. Puedes obtener la aplicación completa aquí: (git@github.com:dongido001/php-couchbase-pagination_complete.git)
Gracias por leernos. Dígame lo que piensa o si tiene alguna pregunta.
Este post forma parte del Programa de Escritura de la Comunidad Couchbase