小谈yii2中3个数据提供者及与GridView的搭配使用

小谈yii2中3个数据提供者及与GridView的搭配使用你可知yii2的世界里还有SqlDataProvider和ArrayDataProvider两位大兄弟?接下来我们把这同家三兄弟的用法做一个小教程。 在ActiveDataProvider中除了query参数都是可选的,比如pagination、sort等。 上面是最常用的,除…

你一定对yii2的ActiveDataProvider很熟悉,黄金组合ActiveDataProvider + GridView帮助无数的yii2开发者快速构造出功能强大的表格。

你可知yii2的世界里还有SqlDataProviderArrayDataProvider两位大兄弟?接下来我们把这同家三兄弟的用法做一个小教程。

本文并非配置篇,对于三兄弟的配置大全阿北会在《yii2配置词典》专栏中进行介绍

ActiveDataProvider

最常用的一个,使用ActiveDataProvider将返回一个对象集合,里面包含了查询的对象群、分页信息等等,一般我们是这样用的

$query = User::find();
$dataProvider = new ActiveDataProvider([
  'query'=>$query,
  'pagination'=>[
    'pageSize'=>20
  ]
]);

在ActiveDataProvider中除了query参数都是可选的,比如pagination、sort等。

当你得到了$dataProvider后,可以将其传给视图和GridView进行无敌组合,当然也可以使用自身的一些方法,比如

获得当前页的所有users

$dataProvider->getModels();//这是一个内含对象的一维数组

获得页码信息

$dataProvider->getTotalCount();// 获得总页数
$dataProvider->getCount();// 当前页码
$dataProvider->getPagination(); // 内含的Pagination对象

上面是最常用的,除此之外还提供了比如refresh等方法。

当然我们最常用的还是将ActiveDataProvider传递给GridView然后渲染出表格。

use yii\grid\GridView;
<?= GridView::widget([
  'dataProvider' => $dataProvider,
]);?>

小结 ActiveDataProvider返回的是对象的集合,确切的说是每一个模型(AR),因此模型的关联特性可以使用,这让我们可以构造出复杂完整的表格。

SqlDataProvider

和名字一样,SqlDataProvider接收一个原生的SQL语句并且能生成一个带有参数的dataProvider,一个月你总会碰到几次是用QueryBuilder构造不出来的复杂SQL。

用法如下

$totalCount = Yii::$app->db->createCommand('SELECT COUNT(*) FROM user WHERE sex=:sex', ['sex:' => 1])
            ->queryScalar();

$dataProvider = new SqlDataProvider([
    'sql' => 'SELECT * FROM user WHERE sex=:sex',
    'params' => [':sex' => 1],
    'totalCount' => $totalCount,
    //'sort' =>false,//如果为假则删除排序
    'sort' => [
        'attributes' => [
            'username' => [
                'asc' => ['username' => SORT_ASC],
                'desc' => ['username' => SORT_DESC],
                'default' => SORT_DESC,
                'label' => '用户名',
            ],
            'sex' => [
                'asc' => ['sex' => SORT_ASC],
                'desc' => ['sex' => SORT_DESC],
                'default' => SORT_DESC,
                'label' => '性别',
            ],
            'created_on'
        ],
    ],
    'pagination' => [
        'pageSize' => 10,
    ],
]);

return $dataProvider;

不要被上面一大堆代码吓到,我只是装个逼而已,其实SqlDataProvider必填的参数只有一项,就是sql。比如我下面的这段代码

$dataProvider = new SqlDataProvider([
    'sql' => 'SELECT * FROM `blog`'
]);

当然SqlDataProvider也有一些方法,比如getModels、getTotalCount等方法,不同的是这里面没有对象了,这里面是数组。这很正常,你不在操作AR了,你现在直接在操作数据库。

而我们在 小谈Yii Framework 2.0(yii2)的数据库层 提到过,AR才是数据表面向对象的归宿。

所以当你搭配GridView的时候,就要如下写代码了

GridView::widget([
    'dataProvider' => $dataProvider,
    'columns' => [
        ['class' => 'yii\grid\SerialColumn'],
        [
            'label' =>"昵称",
            'attribute' => 'nickname',
            'value'=>function($data){
                return $data["nickname"];
            }
        ],
        'username',
        'sex',
        'created_on',
        ['class' => 'yii\grid\ActionColumn'],
    ],
]); 

此刻的$data就是我们sql语句查出的一行。

小结 替补ActiveDataProvider,同时也提供给一些喜欢数组作为结果的小盆友们,无法使用关联属性。当然如果你是一个SQL迷,这种方法也许更直接更快速。

ArrayDataProvider

之所以出现了三种数据提供者(DataProvider)主要是因为我们要面对不同的数据来源、一个Query、一条SQL语句,你看,现在使用ArrayDataProvider你可以将一个数组作为数据来源还。

比如下面的代码

$dataProvider = new ArrayDataProvider([
    'allModels' => Blog::find()->asArray()->all(),// 或Blog::find()->all()
    'pagination' => [
        'pageSize' => 1,
    ],
]);

allModels 是一个必填项,代表数据来源,allModels是一个数组,但是allModels里面的元素并不限制,可以数组或对象,甚至是简单的数据类型,比如数字和字符串。

当然ArrayDataProvider一样可以和GridView组合,比如

GridView::widget([
    'dataProvider' => $dataProvider
]);

对于GridView而言,这三种DataProvider没有区别

小结 给你一堆数据,然后用ArrayDataProvider进行分页、排序、构造表格!也许有其使用的场景吧,不过我现在还没遇到。

小结

这篇文章的初衷是为了让大家知道yii2中一共提供了几种数据提供者以及其使用方法,具体配置等我们会在其他专栏介绍。

在本文也使用了一些文章

  • 就写SQL咋的了~在Yii2中使用SqlDataProvider的方法
  • 小谈Yii Framework 2.0(yii2)的数据库层

原文链接 https://nai8.me/site/index.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/37175.html

(0)

相关推荐

  • 索引的树结构[亲测有效]

    索引的树结构[亲测有效]查找结构的进化 二分查找 二叉树 二叉平衡树 B-TREE :二叉平衡树的基础上,使加载一次节点,可以加载更多路径数据,同时把查询范围缩减到更小 缺点:业务数据的大小可能远远超过了索引数据的大小,每次

    2023-05-27
    36
  • form表单提交file_表单提交文件上传

    form表单提交file_表单提交文件上传if (this.$refs.basicInfo.$refs.licenseNumberPhoto.$children[0].formData.append(“licenseNumberPhoto”, this.$refs.basicInfo.$refs.licenseNumbe…

    2023-07-30
    32
  • mpvue还在维护吗_vue小程序开发框架

    mpvue还在维护吗_vue小程序开发框架本人最近一直在研究小程序,一个偶然的机会发现了mpvue框架,刚好本人对vue十分喜爱,就决定入坑了。曾经在掘金看过一个仿旧版滴滴的小程序,感觉挺不错的,但它是基于原生小程序的,所以就决定花了一段时间用mpvue进行重写。下面就开始正餐了。 为了让头部导航点击时能自动滑出,滑动…

    2023-08-21
    24
  • mysql DateDiff函数「建议收藏」

    mysql DateDiff函数「建议收藏」定义和用法DATEDIFF() 函数返回两个日期之间的天数。语法DATEDIFF(date1,date2)date1 和 date2 参数是合法

    2023-07-06
    30
  • 苏州哪里可以开粮油发票-苏州_新闻网

    苏州哪里可以开粮油发票-苏州_新闻网苏州哪里可以开粮油发票【電薇同步;1.3.7 – 1.0.9.5 – 5.9.1.9.】李生、诚、信、合、作,保、真、售、后、保、障、长、期、有、效。adb的全称为Android Debug Bri…

    2023-02-02
    54
  • 简述在 MySQL 数据库中 MyISAM 和 InnoDB 的区别_m序列的产生方法

    简述在 MySQL 数据库中 MyISAM 和 InnoDB 的区别_m序列的产生方法[toc] 背景 应用端需要生成依次递增的序列来做流水序号等,方案有1、redis /MySQL SEQUENCE引擎生成序列;2、MySQL中myisam表 replace into方式;3、MyS

    2023-02-12
    46
  • SQL 入门教程:使用 WHERE 子句

    SQL 入门教程:使用 WHERE 子句目录汇总:SQL 入门教程:面向萌新小白的零基础入门教程 数据库表一般包含大量的数据,很少需要检索表中的所有行。通常只会根据特定操作或报告的需要提取表数据的子集。只检索所需数据需要指定搜索条件(sea

    2023-04-19
    50
  • swoole 连接池_swoole redis

    swoole 连接池_swoole redis一 .什么是mysql连接池 场景:每秒同时有1000个并发,但是这个mysql同时只能处理400个连接,mysql会宕机。 解决方案:连接池,这个连接池建立了200个和mysql的连接,这1000…

    2023-02-12
    51

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注