你必定對yii2的ActiveDataProvider很熟悉,黃金組合ActiveDataProvider + GridView幫助無數的yii2開發者快速構造出功能強大的表格。php
你可知yii2的世界裏還有SqlDataProvider和ArrayDataProvider兩位大兄弟?接下來咱們把這同家三兄弟的用法作一個小教程。html
本文並不是配置篇,對於三兄弟的配置大全阿北會在《yii2配置詞典》專欄中進行介紹sql
最經常使用的一個,使用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接收一個原生的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迷,這種方法也許更直接更快速。
之因此出現了三種數據提供者(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