如何在分页器上使用数据库映射器?
我在理解如何使用以下代码实现DbSelect分页器时遇到了一些麻烦(现在它正在使用Iterator适配器,该适配器不适用于ResultSets)。
据我所知,这并不像我希望的那样直接。 DbSelect需要一个Zend\Db\Sql\Select
和一个适配器。适配器不是问题,可以使用以下方法检索:
$this->newsContents()->getAdapter()
但是我无法从TableGateway中获取
Select
对象而又不重复查询代码。有解决此问题的简便方法吗?NewsController.php
<?php
namespace News\Controller;
use Zend\Paginator\Paginator;
class NewsController extends \Application\Controller\WebsiteController
{
protected $newsTable;
protected $newsContents;
protected function newsTable()
{
return $this->getServiceLocator()->get('News\Model\NewsTable');
}
protected function newsContents()
{
return $this->getServiceLocator()->get('News\Model\NewsContentsTable');
}
protected function articleId()
{
return (int) $this->params()->fromRoute('id');
}
public function articleAction()
{
$article = $this->newsTable()->getArticle($this->articleId());
$pages = $this->newsContents()->getPages($this->articleId());
$paginator = new Paginator(new \Zend\Paginator\Adapter\Iterator($pages));
$paginator->setCurrentPageNumber($this->params()->fromRoute('page'));
return array(
'css' => 'news.css',
'article' => $article,
'paginator' => $paginator,
);
}
}
NewsContentsTable.php
<?php
namespace News\Model;
use Zend\Db\Adapter\Adapter;
use Zend\Db\ResultSet\ResultSet;
use Zend\Db\TableGateway\AbstractTableGateway;
use Zend\Db\Sql\Select;
class NewsContentsTable extends \Zend\Db\TableGateway\AbstractTableGateway
{
protected $table = 'news_contents';
public function __construct(Adapter $adapter)
{
$this->adapter = $adapter;
$this->resultSetPrototype = new ResultSet;
$this->resultSetPrototype->setArrayObjectPrototype(new NewsContents);
$this->initialize();
}
public function getPages($newsId)
{
$rowset = $this->select(function(Select $select) use ($newsId)
{
$select
->order('order ASC')
->where(array('news_id' => $newsId));
});
return $rowset;
}
}
最佳答案
使用Db Select作为适配器实现分页
// 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-framework2 - Zend Framework 2分页器+ TableGateway,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12441529/