catlabinteractive / cursor-pagination
REST API 的游标分页。
v1.0.8
2020-03-02 15:57 UTC
Requires
- php: >=7.0.0
- catlabinteractive/base: ^1.0.10
Requires (Dev)
- phpunit/phpunit: 5.3.*
README
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/ 上实时运行