查看: 1404|回复: 0

[PHP实例] 小谈yii2中3个数据提供者及与GridView的搭配使用

发表于 2018-4-9 08:00:02

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

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

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

ActiveDataProvider

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

  1. $query = User::find();
  2. $dataProvider = new ActiveDataProvider([
  3. 'query'=>$query,
  4. 'pagination'=>[
  5. 'pageSize'=>20
  6. ]
  7. ]);
复制代码

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

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

获得当前页的所有users

  1. $dataProvider->getModels();//这是一个内含对象的一维数组
复制代码

获得页码信息

  1. $dataProvider->getTotalCount();// 获得总页数
  2. $dataProvider->getCount();// 当前页码
  3. $dataProvider->getPagination(); // 内含的Pagination对象
复制代码

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

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

  1. use yii\grid\GridView;
  2. <?= GridView::widget([
  3. 'dataProvider' => $dataProvider,
  4. ]);?>
复制代码

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

SqlDataProvider

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

用法如下

  1. $totalCount = Yii::$app->db->createCommand('SELECT COUNT(*) FROM user WHERE sex=:sex', ['sex:' => 1])
  2. ->queryScalar();
  3. $dataProvider = new SqlDataProvider([
  4. 'sql' => 'SELECT * FROM user WHERE sex=:sex',
  5. 'params' => [':sex' => 1],
  6. 'totalCount' => $totalCount,
  7. //'sort' =>false,//如果为假则删除排序
  8. 'sort' => [
  9. 'attributes' => [
  10. 'username' => [
  11. 'asc' => ['username' => SORT_ASC],
  12. 'desc' => ['username' => SORT_DESC],
  13. 'default' => SORT_DESC,
  14. 'label' => '用户名',
  15. ],
  16. 'sex' => [
  17. 'asc' => ['sex' => SORT_ASC],
  18. 'desc' => ['sex' => SORT_DESC],
  19. 'default' => SORT_DESC,
  20. 'label' => '性别',
  21. ],
  22. 'created_on'
  23. ],
  24. ],
  25. 'pagination' => [
  26. 'pageSize' => 10,
  27. ],
  28. ]);
  29. return $dataProvider;
复制代码

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

  1. $dataProvider = new SqlDataProvider([
  2. 'sql' => 'SELECT * FROM `blog`'
  3. ]);
复制代码

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

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

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

  1. GridView::widget([
  2. 'dataProvider' => $dataProvider,
  3. 'columns' => [
  4. ['class' => 'yii\grid\SerialColumn'],
  5. [
  6. 'label' =>"昵称",
  7. 'attribute' => 'nickname',
  8. 'value'=>function($data){
  9. return $data["nickname"];
  10. }
  11. ],
  12. 'username',
  13. 'sex',
  14. 'created_on',
  15. ['class' => 'yii\grid\ActionColumn'],
  16. ],
  17. ]);
复制代码

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

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

ArrayDataProvider

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

比如下面的代码

  1. $dataProvider = new ArrayDataProvider([
  2. 'allModels' => Blog::find()->asArray()->all(),// 或Blog::find()->all()
  3. 'pagination' => [
  4. 'pageSize' => 1,
  5. ],
  6. ]);
复制代码

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

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

  1. GridView::widget([
  2. 'dataProvider' => $dataProvider
  3. ]);
复制代码

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

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

小结

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

在本文也使用了一些文章

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

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



回复

使用道具 举报