每天用php做的最多的事差不多就是从db里取数据,展示数据了,有时以网页的形式(分页)展示,有时以csv格式导出数据。今天就对分页去数据做个总结。
根Model
class RModel {
/**
* @param $page array 分页对象
* @param $order string order by 排序
*/
public function pagination($sql, $page, $order = null, $param = array()) {
$countSql = "select count(*) from ({$sql}) c";
$count = $this->createCommand($countSql)->queryCount($param);
if(!empty($order))
$sql .= ' order by ' . $order;
if($page) {
$start = ($page['currentpage'] - 1) * $page['rownum'];
$pagesize = $page['rownum'];
$sql .= " limit {$start},{$pagesize} ";
}
$data = $this->createCommand($sql)->queryAll(true, $param);
return array('list' => $data, 'total' => $count);
}
/**
* 查询所有数据
*/
public function listAll($sql, $order=null, $param=array()) {
if(!empty($order))
$sql .= (' order by ' . $order);
return $this->createCommand($sql)->query($param);
}
}
具体业务model
class ConcreteModel extends RModel {
protected function _getQuerySql($param) {
$sql = "";
$bindParams = array();
/*
* 拼接sql
*/
return array($sql, $bindParams);
}
public function listData($param, $page) {
list($sql, $bindParams) = $this->_getQuerySql($param);
return $this->pagination($sql, $page, 'id desec', $bindParams);
}
public function exportData($param) {
list($sql, $bindParams) = $this->_getQuerySql($param);
return $this->listAll($sql, 'id desec', $param);
}
}
controller
class ConcreteController {
public function actionConcrete() {
$request = new Request();
$model = new ConcreteModel();
if($request->getParam('actionType') == 'export') {
$dataReader = $model->exportData($request);
$this->exportData($dataReader);
exit;
}
$page = Pagination::filterPageInfo($request);
$data = $model->listData($request, $page);
$this->render('test.html',$data);
}
/*
* 以csv格式导出数据
*/
private function exportData($dataReader) {
}
}
在加一个分页小工具
class Pagination {
public static function filterPageInfo($request, $defaultPagesize = 10) {;
$pagenum = intval($request->getParam('pageno', 1));
$pagesize = intval($request->getParam('pagesize', $defaultPagesize));
$pagenum = $pagenum > 0 ? $pagenum : 1;
$pagesize = $pagesize > 0 ? $pagesize : $defaultPagesize;
return array('currentpage' => $pagenum, 'rownum' => $pagesize);
}
}
这样,我们每次要做就是就根据查询参数,拼写sql,对取出的数据做单独的格式化展示就行了