doctrine分页组件pagerfanta单独使用完全攻略

本文介绍如何在不依赖框架的情况下,使用Doctrine DBAL和Pagerfanta实现数据分页功能。通过构建查询语句并结合分页组件,演示了完整的分页实现过程。
为了独立使用composer,不依赖框架。
假设当前使用的db类库是doctrine,则分页该怎么用?
本代码完全脱离symfony环境。只加载对应的db类库,故意不使用模板,让代码含义更加清晰。

composer

{
"require": {
"doctrine/dbal":"2.5.12",
"pagerfanta/pagerfanta":"1.0.5"
}
}


建表

CREATE TABLE `test_databases` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`db_name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '库名',
`user_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '测试用户id',
`created_at` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
`updated_at` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '修改时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB


请自行插入一百条数据。

假设本机项目域名www.t3.com
本代码网址
http://www.t3.com/paginator/doctrine
首页只需输入上面网址即可,点击分页链接,会自动加page查询参数。


<?php

namespace app\control;
// use Illuminate\Database\Capsule\Manager as Capsule;
// // use \Illuminate\Events\Dispatcher;
// // use \Illuminate\Container\Container;
// use Illuminate\Pagination\UrlWindow;

use Doctrine\DBAL\Query\QueryBuilder;
use Doctrine\DBAL\Configuration;
use Doctrine\DBAL\DriverManager;

use Pagerfanta\Adapter\DoctrineDbalAdapter;
use Pagerfanta\Pagerfanta;
use Pagerfanta\View\DefaultView;

class Paginator {

public function doctrine( $req, $res, $args) {


$config = new Configuration();
//..
$connectionParams = array(
'dbname' => 'test1',
'user' => 'root',
'password' => 'root',
'host' => '127.0.0.1',
'driver' => 'pdo_mysql',
'charset'=>'UTF8',
);
$conn = DriverManager::getConnection($connectionParams, $config);

//构造查询语句。
$queryBuilder = new QueryBuilder($conn);
$queryBuilder->select('p.*')->where("p.id < 100")->from('test_databases', 'p')
->orderBy("p.id","asc");

$countQueryBuilderModifier = function ($queryBuilder) {
$queryBuilder->select('COUNT(*) AS total_results')
->setMaxResults(1);
};
$adapter = new DoctrineDbalAdapter($queryBuilder, $countQueryBuilderModifier);
$pagerfanta = new Pagerfanta($adapter);

$page = intval( $_GET["page"]);
if (!$page) {
$page=1;
}

//设置当前页,最大页面。
$pagerfanta->setMaxPerPage(4)->setCurrentPage($page);

//打印当前页面的结果
foreach ($pagerfanta->getCurrentPageResults() as $v ) {
echo $v['db_name'] .' = ' . $v['user_id']."<br>";
}

//打印分页链接。
$routeGenerator = function($page) { // 匿名函数解决链接字符串
return '/paginator/doctrine?page='.$page;
};
$view = new DefaultView();
$options = array('proximity' => 3); // 这个数字干嘛用?中间的链接个数=这个数字*2+1,这个数字一般取3.
$html = $view->render($pagerfanta, $routeGenerator, $options);
echo $this->default_css();
echo "<div class='pagerfanta'>" .$html."</div>";



return $res;

}

private function default_css()
{
$css=<<<css
<style>
.pagerfanta {
}

.pagerfanta a,
.pagerfanta span {
display: inline-block;
border: 1px solid blue;
color: blue;
margin-right: .2em;
padding: .25em .35em;
}

.pagerfanta a {
text-decoration: none;
}

.pagerfanta a:hover {
background: #ccf;
}

.pagerfanta .dots {
border-width: 0;
}

.pagerfanta .current {
background: #ccf;
font-weight: bold;
}

.pagerfanta .disabled {
border-color: #ccf;
color: #ccf;
}


.pagerfanta a,
.pagerfanta span {
border-color: blue;
color: blue;
}

.pagerfanta a:hover {
background: #ccf;
}

.pagerfanta .current {
background: #ccf;
}

.pagerfanta .disabled {
border-color: #ccf;
color: #cf;
}
</style>
css;
return $css;
}
}


效果展示
[img]http://dl2.iteye.com/upload/attachment/0125/9314/817ca7b7-a938-3250-be94-4bde78ea222b.png[/img]
[img]http://dl2.iteye.com/upload/attachment/0125/9316/da08d181-66bc-3ebc-901d-3ab5d3d99000.png[/img]
[img]http://dl2.iteye.com/upload/attachment/0125/9318/4a39acec-df67-3fe6-99c0-77e992dc790b.png[/img]
[img]http://dl2.iteye.com/upload/attachment/0125/9320/be008859-a7bd-3ecc-a365-ab06b27d050f.png[/img]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值