小談yii2中3個數據提供者及與GridView的搭配使用

你必定對yii2的ActiveDataProvider很熟悉,黃金組合ActiveDataProvider + GridView幫助無數的yii2開發者快速構造出功能強大的表格。php

你可知yii2的世界裏還有SqlDataProviderArrayDataProvider兩位大兄弟?接下來咱們把這同家三兄弟的用法作一個小教程。html

本文並不是配置篇,對於三兄弟的配置大全阿北會在《yii2配置詞典》專欄中進行介紹sql

ActiveDataProvider

最經常使用的一個,使用ActiveDataProvider將返回一個對象集合,裏面包含了查詢的對象羣、分頁信息等等,通常咱們是這樣用的數據庫

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

在ActiveDataProvider中除了query參數都是可選的,好比pagination、sort等。數組

當你獲得了$dataProvider後,能夠將其傳給視圖和GridView進行無敵組合,固然也可使用自身的一些方法,好比yii2

得到當前頁的全部usersapp

$dataProvider->getModels();//這是一個內含對象的一維數組
複製代碼

得到頁碼信息yii

$dataProvider->getTotalCount();// 得到總頁數
$dataProvider->getCount();// 當前頁碼
$dataProvider->getPagination(); // 內含的Pagination對象
複製代碼

上面是最經常使用的,除此以外還提供了好比refresh等方法。ide

固然咱們最經常使用的仍是將ActiveDataProvider傳遞給GridView而後渲染出表格。ui

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中一共提供了幾種數據提供者以及其使用方法,具體配置等咱們會在其餘專欄介紹。

在本文也使用了一些文章

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

相關文章
相關標籤/搜索