ThinkPHP框架扩展数据模型page()分页方法-JModel

TP自带的ThinkPHP\Model模型类,有内置page()方法,参数有两个,分别是起始记录数和每页记录数,这样就要求在调用之前计算出起始记录数,再传递,通常这样用:

$map = array();//筛选数组
$model = M('Table');//创建模型
$total = $model->where($map)->count();//根据过滤条件计算总记录数
$listRows = 20;//每页记录数
$page = new \Think\Page($total, $listRows, $REQUEST);//实例化分页类,并传递总记录数,每页记录数

$data = $model->field($field)->where($map)->page($page->firstRow.','.$page->listRows)->select();//根据分页参数获取数据
$p = $page->show();//获取分页链接

这种写法虽然实现了连贯的写法,但是还是处在半自动的阶段,需要先算出总记录数再传递,不太人性化。
于是,我进行了改进,新建Common\Model\JModel类,继承自ThinkPHP\Model类,将page方法进行了改进,想要的结果就是一行就能解决数据与分页的问题,改进后这样用:

$model = new \Common\Model\JModel('Table');// 实例化数据模型
$data = $model->where($map)->page(20)->select();//根据分页参数获取数据,page方法有两个参数,分别是每页记录数,总记录数,均可选
$page = $model->showPage();//获取分页链接

这样对比起来,是不是就很简单,舒服多了:)

===============华丽丽的分割线===============
如果还嫌代码多,当然,可以再简化,在Application/Common/Common/function.php中,增加如下方法:

/**
 * 实例化一个没有模型文件的Model
 * ADD.JENA.20141220
 * @param string $name Model名称 支持指定基础模型 例如 MongoModel:User
 * @param string $tablePrefix 表前缀
 * @param mixed $connection 数据库连接信息
 * @return Think\Model
 */

function JM($name='', $tablePrefix='',$connection='') {
    static $_model  = array();
    if(strpos($name,':')) {
        list($class,$name)    =  explode(':',$name);
    }else{
        $class      =   'Common\\Model\\JModel';
    }
    $guid           =   (is_array($connection)?implode('',$connection):$connection).$tablePrefix . $name . '_' . $class;
    if (!isset($_model[$guid]))
        $_model[$guid] = new $class($name,$tablePrefix,$connection);
    return $_model[$guid];
}

上述用法即可简化成:

$model = JM('Table');// 实例化数据模型
$data = $model->where($map)->page(20)->select();
$page = $model->showPage();

OK,大功告成!本修改不牵涉到TP框架核心,不影响后续升级。
Injoin PHP!
ThinkPHP.JModel.zip

Leave a Comment

Your email address will not be published.

*