Zend framework2 Zend Framework 2 Paginator+TableGateway 如何将数据库映射器与paginator一起使用?

Zend framework2 Zend Framework 2 Paginator+TableGateway 如何将数据库映射器与paginator一起使用?,zend-framework2,zend-db,zend-paginator,tablegateway,Zend Framework2,Zend Db,Zend Paginator,Tablegateway,现在,我在理解如何使用下面的代码实现DbSelect分页器时遇到了一些困难,因为它使用的迭代器适配器不适用于resultset 据我所知,这并不像我希望的那样直截了当。DbSelect需要一个Zend\Db\Sql\Select和一个适配器。适配器没有问题,可以通过以下方式检索: $this->newsContents()->getAdapter() 但是,如果不复制查询代码,我就很难从TableGateway中获取Select对象。有没有简单的方法来解决这个问题 NewsCont

现在,我在理解如何使用下面的代码实现DbSelect分页器时遇到了一些困难,因为它使用的迭代器适配器不适用于resultset

据我所知,这并不像我希望的那样直截了当。DbSelect需要一个Zend\Db\Sql\Select和一个适配器。适配器没有问题,可以通过以下方式检索:

$this->newsContents()->getAdapter()
但是,如果不复制查询代码,我就很难从TableGateway中获取Select对象。有没有简单的方法来解决这个问题

NewsController.php

NewsContentsTable.php

在$rowset中返回之前使用buffer和next

$rowset->buffer();
$rowset->next();

return $rowset;
但是,如果不复制查询代码,我就很难从TableGateway中获取Select对象。有没有简单的方法来解决这个问题

您可以在NewsContentsTable类中获得select对象,如下所示:

$this->getSql()->select();

使用DbSelect作为适配器实现分页器

// controller
public function articleAction()
{
    //...
    $paginator = $this->newsContents()->getPages($this->articleId());
    $paginator->setCurrentPageNumber($this->params()->fromRoute('page'));

    return array(
        'css'       => 'news.css',
        'article'   => $article,
        'paginator' => $paginator,
    );
}
?>

// table
public function getPages($newsId)
{
    $sql = $this->getSql();
    $select = $sql->select();
    $select->where(array('news_id' => $newsId))->order('id ASC');
    $adapter = new \Zend\Paginator\Adapter\DbSelect($select, $sql);
    $paginator = new \Zend\Paginator\Paginator($adapter);
    return $paginator;
}

在Zend Framework 2.2中,它更容易使用,并允许您充分享受TableGateway提供的优势-您应该使用

use Zend\Db\TableGateway\TableGateway;
use Zend\Paginator\Paginator;
use Zend\Paginator\Adapter\DbTableGateway;  // !!!

 
$dbTableGatewayAdapter = new DbTableGateway($this->tableGateway);
$paginator = new Paginator($dbTableGatewayAdapter);
return $paginator;

下面是ZF2中分页的示例代码

 <?php
    //var/www/html/zend_app/module/Application/src/Application/Controller/Plugin/MyCustomPlugin.php
    namespace Application\Controller\Plugin;

    use Zend\View\Helper\AbstractHelper;

    use Zend\Db\Adapter\Adapter;
    use Zend\Db\ResultSet\ResultSet;
    use Zend\Db\Sql\Select;
    use Zend\Db\Sql\Sql;
    use Zend\Db\Sql\Where;

    use Zend\Mvc\Controller\Plugin\AbstractPlugin;

    use Zend\Paginator\Paginator;
    use Zend\Paginator\Adapter\Iterator as paginatorIterator;
    use Zend\Paginator\Adapter\DbSelect;

    class MyCustomPlugin extends AbstractPlugin {

        protected $adapter;

        public function __construct(\Zend\Db\Adapter\Adapter $adapter) {
            $this->adapter = $adapter;
        }




         public function getPaginatedTableData($tableName, $whereData = "", $selectedColumn = '' , $currentPageNumber = 1) {

            $sql = new Sql($this->adapter);
            $select = $sql->select();

            if ($selectedColumn) {
                $select->columns($selectedColumn);
            }
            $select->from($tableName);
            if ($whereData) {
                $select->where($whereData);
            }

            $paginator = $this->getPaginatorForSelect($select, $currentPageNumber);


            $resultSet = new ResultSet;
            $resultSet->initialize($paginator);
            $resultSet->buffer();

              $pagination = array(
               'current_page_number'=>$currentPageNumber,
               'page_count'=>$paginator->getPages()->pageCount,
               'previous'=>isset($paginator->getPages()->previous)?$paginator->getPages()->previous:0,
               'next'=>isset($paginator->getPages()->next)?$paginator->getPages()->next:0,
               );


 return ($resultSet &&  0 != $paginator->getPages()->pageCount)?array('resultSet'=>$resultSet->toArray(), 'pagination'=>$pagination):FALSE;

        }




        public function getPaginatorForSelect($select, $page, $limit=2)
    {
    $paginatorAdapter = new DbSelect($select, $this->adapter);
    $paginator = new Paginator($paginatorAdapter);
    $paginator->setItemCountPerPage($limit);
    $paginator->setPageRange(5);
    $paginator->setCurrentPageNumber($page);
    return $paginator;
    }

    }

HTH

谢谢你的回答,看起来这是提供的答案中最正确的。回答得好,但是,这个分页器是如何工作的呢?类本身将根据setCurrentPageNumber或setItemCountPerPage?向查询添加限制和偏移量。。。。或者它只是使用类似数组的东西?…我相信这样做更明智。正当
use Zend\Db\TableGateway\TableGateway;
use Zend\Paginator\Paginator;
use Zend\Paginator\Adapter\DbTableGateway;  // !!!

 
$dbTableGatewayAdapter = new DbTableGateway($this->tableGateway);
$paginator = new Paginator($dbTableGatewayAdapter);
return $paginator;
 <?php
    //var/www/html/zend_app/module/Application/src/Application/Controller/Plugin/MyCustomPlugin.php
    namespace Application\Controller\Plugin;

    use Zend\View\Helper\AbstractHelper;

    use Zend\Db\Adapter\Adapter;
    use Zend\Db\ResultSet\ResultSet;
    use Zend\Db\Sql\Select;
    use Zend\Db\Sql\Sql;
    use Zend\Db\Sql\Where;

    use Zend\Mvc\Controller\Plugin\AbstractPlugin;

    use Zend\Paginator\Paginator;
    use Zend\Paginator\Adapter\Iterator as paginatorIterator;
    use Zend\Paginator\Adapter\DbSelect;

    class MyCustomPlugin extends AbstractPlugin {

        protected $adapter;

        public function __construct(\Zend\Db\Adapter\Adapter $adapter) {
            $this->adapter = $adapter;
        }




         public function getPaginatedTableData($tableName, $whereData = "", $selectedColumn = '' , $currentPageNumber = 1) {

            $sql = new Sql($this->adapter);
            $select = $sql->select();

            if ($selectedColumn) {
                $select->columns($selectedColumn);
            }
            $select->from($tableName);
            if ($whereData) {
                $select->where($whereData);
            }

            $paginator = $this->getPaginatorForSelect($select, $currentPageNumber);


            $resultSet = new ResultSet;
            $resultSet->initialize($paginator);
            $resultSet->buffer();

              $pagination = array(
               'current_page_number'=>$currentPageNumber,
               'page_count'=>$paginator->getPages()->pageCount,
               'previous'=>isset($paginator->getPages()->previous)?$paginator->getPages()->previous:0,
               'next'=>isset($paginator->getPages()->next)?$paginator->getPages()->next:0,
               );


 return ($resultSet &&  0 != $paginator->getPages()->pageCount)?array('resultSet'=>$resultSet->toArray(), 'pagination'=>$pagination):FALSE;

        }




        public function getPaginatorForSelect($select, $page, $limit=2)
    {
    $paginatorAdapter = new DbSelect($select, $this->adapter);
    $paginator = new Paginator($paginatorAdapter);
    $paginator->setItemCountPerPage($limit);
    $paginator->setPageRange(5);
    $paginator->setCurrentPageNumber($page);
    return $paginator;
    }

    }