假设当前使用的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; } }
效果展示