La paginación en algo básico en proyectos web y una relación ternaria es algo bastante común en bases de datos. Consiste en tener una tabla que relacione mediante ids a otras dos tablas, por ello esas dos tablas se van a conocer a través de la que contiene los ids.
Aquí se tratará el ejemplo de unos artículos (tabla articulos) que tienen X categorías (tabla categorías), por lo que crearemos una tabla llamada articulos_has_categorias que es la que contiene los ids de referencia a los otras tablas. Esos ids se llamarán articulo_id y categoria_id. De este modo un artículo puede tener una o más categoriás.
Ahora tendremos dos opciones o bien crear las relaciones en los modelos de phalcon manualmente siguiendo esta info de la página de phalconphp 3.X o crear las foreing keys en base de datos (solo hace falta en la tabla de relaciones de ids) y crear los modelos con el comando:
phalcon create-model --name=articulos
phalcon create-model --name=categorias
phalcon create-model --name=articulos_has_categorias
Con esto phalconphp ya te creará las relaciones en los modelos como el ejemplo del enlace anterior.
Ahora al hacer una query al modelo Articulos, nos va a traer esas categorías.
Creamos la paginación ayudándonos del PaginatorQueryBuilder.
use Phalcon\Paginator\Adapter\QueryBuilder as PaginatorQueryBuilder;
En mi caso para la query utilizaré el createBuilder para realizar la query y le pasaré una condición de que el articulo esté activo.
$parameters['conditions'] = 'Articulos.activo = 1';
$builder = $this->modelsManager->createBuilder($parameters)
->columns(['Articulos.*'])
->from(['Articulos' => 'Salamandra\Models\Articulos'])
->orderBy('Articulos.created DESC')
->groupBy('Articulos.id');
La paginación en el controller:
$paginator = new PaginatorQueryBuilder(
[
'builder' => $builder,
'limit' => 1,
'page' => $numberPage,
]
);
$this->view->page = $paginator->getPaginate();
Y la view quedaría con un título, enlace y con nuestra/s categoría/s recogidas de la relación ternaría:
<?php if ($page->total_items != 0) { ?>
<?php foreach ($page->items as $articulo): ?>
<h1>
<?php echo $this->tag->linkTo('/articulos/' . $articulo->slug, $articulo->nombre_articulo); ?>
</h1>
<p>
<?php
foreach ($articulo->ArticulosHasCategorias as $articuloCategoria) {
$categorias .= $articuloCategoria->Categorias->nombre_categoria . ', ';
}
// se pintan las categorías del artículo separadas por comas
echo trim($categorias, ', ');
?>
</p>
<?php endforeach; ?>
<?php } ?>
<div class="paginacion">
<p><?php echo $page->current, "/", $page->total_pages ?></p>
<ul>
<li><?php echo $this->tag->linkTo("articulos", "Primero") ?></li>
<li><?php echo $this->tag->linkTo("articulos?page=" . $page->before, "Anterior") ?></li>
<li><?php echo $this->tag->linkTo("articulos?page=" . $page->next, "Siguiente") ?></li>
<li><?php echo $this->tag->linkTo("articulos?page=" . $page->last, "Último") ?></li>
</ul>
</div>