luanmaik/pdo-paginator

这个库允许使用PDO扩展轻松实现分页

1.0 2020-08-11 00:13 UTC

This package is auto-updated.

Last update: 2024-09-12 07:28:32 UTC


README

这个库可以帮助您使用PDO轻松创建记录分页。

php coverage php

使用Composer安装

composer require luanmaik/pdo-paginator

常用解决方案

使用 SQL_CALC_FOUND_ROWS & FOUND_ROWS()

# Search data
SELECT SQL_CALC_FOUND_ROWS * FROM user WHERE role = 'admin' LIMIT 10 OFFSET 5;
# Get number rows existents in previous query
SELECT FOUND_ROWS();

优点:简单

缺点:当使用复杂查询时较慢。 FOUND_ROWS() 已弃用。

使用 COUNT()

# Search data
SELECT * FROM user WHERE role = 'admin' LIMIT 10 OFFSET 5;
# Get number rows existents
SELECT count(*) FROM user WHERE role = 'admin';

优点:易于阅读且效率高。

缺点:冗长。

这个库是如何工作的?

它使用 count(*) 分页方法(如上所述),但具有简单的实现。您设置查询,库在幕后定义 limitoffset 指令,并运行一个使用 count(*) 的第二个查询以找到可用的总记录数。

请参阅下面的示例。

简单用法示例

$paginator = new PDOPaginator\PDOPaginator($pdoConnection);
// Don't define the LIMIT instruction in your query
$paginator->query("SELECT * FROM users");
$paginationCollection = $paginator->execute($perPage = 15, $page = 1);

$paginationCollection->getTotal(); // Return total number of data in databse;
$paginationCollection->getData(); // Return array data;
$paginationCollection->getPerPage(); // 15 ... Return the number of registers per page
$paginationCollection->getPage(); // 1 ... Return the number page
$paginationCollection->getTotalPages(); // Return the total number of pages
$paginationCollection->getPaginationArray(); // Return the pagination details in array

条件查询参数示例

使用 bindValue() 方法。

$paginator = new PDOPaginator\PDOPaginator($pdoConnection);
$paginator->query("SELECT * FROM users WHERE role = :role");
$paginator->bindValue(':role', 'admin', PDO::PARAM_STR);
$paginationCollection = $paginator->execute($perPage = 15, $page = 1);

自定义获取模式

execute() 方法中使用第三个和第四个参数。

$paginator = new PDOPaginator\PDOPaginator($pdoConnection);
$paginator->query("SELECT * FROM users");
$paginationCollection = $paginator->execute($perPage = 15, $page = 1, PDO::FETCH_CLASS, User::class);

$paginationCollection->getData(); // returns User[]

自定义集合

__construct() 方法中使用第二个参数。自定义类必须实现 \PDOPaginator\PDOPaginationCollectionInterface

// Create a custom collection
class MyCustomCollection extends \ArrayIterator implements \PDOPaginator\PDOPaginationCollectionInterface {
    //...
}
//OR you can extends the default collection implementation
class MyCustomCollection extends \PDOPaginator\PDOPaginationCollection {
    // overwrite some methods like toArray(), getPaginationArray(), etc.
}

$paginator = new PDOPaginator\PDOPaginator($pdoConnection, MyCustomCollection::class);
$paginator->query("SELECT * FROM users");
$paginationCollection = $paginator->execute($perPage = 15, $page = 1, PDO::FETCH_CLASS, User::class);