Yii2——在模型(Model)中使用分页(Pagination)

本文链接:https://www.cnblogs.com/alanabc/p/9407193.html

当一次要在一个页面上显示很多数据时, 通常需要将其分成几部分, 每个部分都包含一些数据列表并且一次只显示一部分。 这些部分在网页上被称为 分页。

见 Yii Framework 官方网站网址:https://www.yiiframework.com/doc/guide/2.0/zh-cn/output-pagination

官方案例和网上大多数的例程都是在控制器(Controller)中使用分页(Pagination),这里提供一个在模型(Model)中使用的例程。至于选用哪个,看实际情况决定,我这里是为了方便分割代码逻辑。


准备工作(数据库)

我已经部署好了 Yii2,现在数据库中有一个数据表叫做 order,存放有订单(数据字段略)。

模型 Model

根据 Yii 的命名规则,在 models 文件夹中新建 Order.php 文件,内容和注释如下:

<?php
namespace app\models;

// 记得导入class
use yii\data\Pagination;
use yii\widgets\ActiveForm;

class Order extends ActiveForm
{
    // 私有,防止被外部代码篡改
    private $pagination;

    /**
     * 获取$pagination,提供给外部代码调用
     * @return mixed
     */
    public function getPagination()
    {
        return $this->pagination;
    }

    /**
     * 从Order数据表中查询所有条目,并以id字段为基准,进行降序排列输出
     * @return mixed
     */
    public function getAll()
    {
        // 预查询,此时还没有执行。where()条件查询、orderBy()排序等都应该放在这里
        $query = Order::find()->orderBy(['id' => SORT_DESC]);
        // 获取能够查询到的数据条目数量(这就是条件查询等语句要放在上一行代码的原因),但是还没有执行查询
        $count = $query->count();
        // 构造分页对象
        $this->pagination = new Pagination(['totalCount' => $count]);
        // 使用分页对象填充limit语句,并获得数据(此时才真正执行数据库查询)
        return $query->offset($this->pagination->offset)
            ->limit($this->pagination->limit)
            ->asArray()
            ->all();
    }
}

控制器 Controller

控制器主要控制数据输入输出,需要把上面模型中的数据当作参数传递给视图(View)。在 controllers 文件夹中创建你的控制器类,我这里直接使用 Yii2 Basic版原有的 SiteController.php

<?php
namespace app\controllers;

use Yii;
use yii\web\Controller;
use app\models\Order;

class SiteController extends Controller
{
    public function actionOrder(){
        $model = new Order();
        $data = $model->getAll();
        // 在这里把模型中的分页对象$pagination作为参数pagination传递给视图
        return $this->render('orderList', [
            'data' => $data,
            'pagination' => $model->getPagination()
        ]);
    }
}

视图 View

根据 Yii2 的命名规则,在view/site 文件夹内新建视图文件 orderList.php,其内容如下,主要是获得控制器传过来的参数并渲染

<?php
// 再次提醒,不要忘记引用class
use \yii\widgets\LinkPager;
?>
<!--content start, write content bellow.-->

<!--table start-->
<table>
    <thead>
    <tr>
        <th>订单流水号</th>
        <th>收款方</th>
        <th>付款方</th>
        <th>付款金额</th>
        <th>付款时间</th>
        <th>操作</th>
    </tr>
    </thead>
    <tbody>
    <?php if (!empty($data)) {
        // 输出数据
        foreach ($data as $v) {
            ?>
            <tr>
                <td><?= $v['order_number'] ?></td>
                <td><?= $v['payee'] ?></td>
                <td><?= $v['payer'] ?></td>
                <td><?= $v['payment_amount'] ?></td>
                <td><?= $v['time_of_payment'] ?></td>
                <td>
                    <button>查看</button>
                </td>
            </tr>
        <?php }
    } else { ?>
        <tr>
            <td colspan="6">暂时没有数据</td>
        </tr>
    <?php } ?>
    </tbody>
</table>
<!--table end-->
<?php
try {
    // 输出分页按钮
    echo LinkPager::widget(['pagination' => $pagination]);
} catch (Exception $e) {
    // do nothing
}
?>

<!--content end-->

上面代码中的 echo LinkPager::widget(['pagination' => $pagination]); 就把分页按钮给输出了,默认每页20条数据,点击页码就可以输出当页的数据,js 代码什么的都不需要自己动手写。至于样式,当然是自己写 css 咯。

转载于:https://www.cnblogs.com/alanabc/p/9407193.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值