catlabinteractive / cursor-pagination

REST API 的游标分页。

v1.0.8 2020-03-02 15:57 UTC

This package is auto-updated.

Last update: 2024-09-17 18:29:22 UTC


README

Build Status

REST API 的游标分页。

目标

为 API 或 Web 服务提供基于游标的分页。该库计算 SQL 查询参数和应通过请求传递的游标。

所以,像 LIMIT {offset}, {records} 一样吗?

基于游标的分页通常比基于页面的分页(使用 SQL 偏移量)性能更好,因为它过滤记录而不是限制返回的记录数量。

对于更改数据,基于游标的分页也更加正确,因为向列表开头添加一行可能会移动所有记录。

有关更多信息,请参阅这篇优秀的文章 https://www.sitepoint.com/paginating-real-time-data-cursor-based-pagination/

示例

<?php 

use CatLab\Base\Models\Database\OrderParameter;
use CatLab\CursorPagination\CursorPaginationBuilder;

require '../vendor/autoload.php';
require 'helpers.php';
$pdo = require 'mockdata.php';

$builder = new CursorPaginationBuilder();

// Show 5 records on each page
$builder->limit(isset($_GET['records']) ? $_GET['records'] : 5);

// Register properties
$builder->registerPropertyName('id', 'public_id');
$builder->registerPropertyName('name', 'public_name');
$builder->registerPropertyName('score', 'public_score');

/**
 * Set select order
 */

// Order by score desc
$builder->orderBy(new OrderParameter('score', OrderParameter::DESC));

// Same score? Order by name asc
$builder->orderBy(new OrderParameter('name', OrderParameter::ASC));

// Same score and same name? Sort on ID
$builder->orderBy(new OrderParameter('id', OrderParameter::ASC));

// Set the request parameters
$builder->setRequest($_GET);

/**
 * Select and output data
 */
// Build the select query
$query = $builder->build();

// Load the data
$sql = $query->toQuery($pdo, 'entries');
$results = $pdo->query($sql)->fetchAll();

// Post process results. Very important. Don't forget.
$results = $builder->processResults($query, $results);

// Display the records
$table = new Table([ 'id', 'name', 'score' ]);
$table->open();
foreach ($results as $v) {
    $table->row($v);
}
$table->close();

$table->navigation($builder->getNavigation());

此示例在 https://dev.catlab.eu/cursor-pagination/examples/ 上实时运行