數據提供者 dataProvider
$dataProvider = new ActiveDataProvider([ 'query' => $query, // 如何來取得數據 'pagination' => ['pageSize'=>5], // pagination 用於分頁 'sort' => [ // sort 用於排序 'defaultOrder' => [ 'id' => SORT_DESC, // defaultOrder 指定默認排序字段 ], 'attributes' => ['id','title'], // attribute 指定那幾個字段可以用來排序 ], ]);
如果需要打印原生sql,使用如下方法:
echo $query ->createCommand()->getRawSql();
$dataProvider->query->each() //獲取 $dataProvider 所有記錄;
$dataProvider->getModels() // 獲取當前頁的數據,以數組的方式返回
由於 $dataProvider->getModels() 獲取的數據是當前頁的,如果在導出的時候需要導出所有記錄而不是當前頁,且又使用的是 SqlDataProvider ,那么就可以在控制器文件中在重新設置一下分頁,將值設置的特別大,就可以模擬為不分頁了。
use yii\db\Pagination;
$dataProvider = $searchModel->search(\Yii::$app->request->getQueryParams()); $dataProvider->setPagination(new Pagination([ 'defaultPageSize' => 10000,
'pageSizeLimit' => [1, 10000] ]));
二、Yii的數據提供者類都包含:
- yii\data\ActiveDataProvider:使用 yii\db\Query 或者 yii\db\ActiveQuery 從數據庫查詢數據並且以數組項的方式或者 Active Record 實例的方式返回。
- yii\data\SqlDataProvider:執行一段SQL語句並且將數據庫數據作為數組返回。
- yii\data\ArrayDataProvider:將一個大的數組依據分頁和排序規格返回一部分數據。
如果需要使用 UNION 聯合多張表查詢,且查詢中還可能包含 關聯查詢(join)的時候,使用 SqlDataProvider 來實現如下:
<?php namespace organize\models; use Yii; use yii\base\Model; use standard\models\Country; use organize\models\User; use yii\db\Expression; use yii\data\SqlDataProvider; class CountrySearch extends Country { /** * @inheritdoc */
public function rules() { return [ [['country_id', 'created_at', 'updated_at', 'is_delete'], 'integer'], [[ 'country_name','remarks'], 'safe'], ]; } /** * @inheritdoc */
public function scenarios() { // bypass scenarios() implementation in the parent class
return Model::scenarios(); } /** * Creates data provider instance with search query applied * * @param array $params * * @return SqlDataProvider */
public function search($params) { $query = self::find() ->select(['country_id AS unique_id','country_name','created_at']) ->addSelect(new Expression("'country' AS table_name")); // 查詢一個常量
$this->load($params); // grid filtering conditions
$query->andFilterWhere([ 'country_id' => $this->country_id,
'created_at' => $this->created_at,
'updated_at' => $this->updated_at,
'is_delete' => $this->is_delete, ]); $query->andFilterWhere(['like', 'country_name', $this->country_name]) ->andFilterWhere(['like', 'remarks', $this->remarks]); $query->from('standard.country'); // 有多個庫名的時候使用
$userQuery = User::find(); $userQuery->innerJoin('organize.org_auth_assignment','org_user.id=org_auth_assignment.user_id') ->select(['id AS unique_id','realname','sex','dept_id','mobile','email','qq','org_auth_assignment.name as role','org_user.created_at']) ->addSelect(new Expression("'org_user' AS table_name")); $userQuery->andFilterWhere(['like', 'realname', $this->realname]) ->andFilterWhere(['like', 'sex', $this->sex]) ->andFilterWhere(['=', 'org_auth_assignment.name', $this->role]) ->andFilterWhere(['like', 'mobile', $this->mobile]) ->andFilterWhere(['like', 'email', $this->email]) ->andFilterWhere(['like', 'qq', $this->qq]); $userQuery->from('organize.org_user'); $query->union($userQuery,true); // 聯合查詢
$sql = $query->createCommand()->rawSql; // 生成一條不帶分頁的 sql
$dataProvider = new SqlDataProvider([ 'sql' => $sql,
'totalCount' => $query->count(),
'sort' => false,
'pagination' => [ 'pageSize' => 20, ], ]); if (!$this->validate()) { // uncomment the following line if you do not want to return any records when validation fails // $query->where('0=1');
return $dataProvider; } //echo $query->createCommand()->getRawSql();
return $dataProvider; } } // 最后的 $dataProvider 渲染到頁面后,用 ArrayHelper() 即可獲取對應的值
關於 $dataProvider 更詳細的內容,請參考官網:http://www.yiichina.com/doc/guide/2.0/output-data-providers
注:本文為作者(44106-kangaroo) 看完魏羲教你學Yii2.0 視頻后所記,如有轉載請注明出處:http://www.cnblogs.com/chrdai/p/7966640.html