zoukankan      html  css  js  c++  java
  • yii2 数据提供者 dataProvider

    数据提供者 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 yiidbPagination;
    $dataProvider = $searchModel->search(Yii::$app->request->getQueryParams()); $dataProvider->setPagination(new Pagination([ 'defaultPageSize' => 10000, 'pageSizeLimit' => [1, 10000] ]));

    二、Yii的数据提供者类都包含:

    如果需要使用 UNION 联合多张表查询,且查询中还可能包含 关联查询(join)的时候,使用 SqlDataProvider 来实现如下:

    <?php
    namespace organizemodels;
    
    use Yii;
    use yiiaseModel;
    use standardmodelsCountry;
    use organizemodelsUser;
    use yiidbExpression;
    use yiidataSqlDataProvider;
    
    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

  • 相关阅读:
    单体架构还是微服务架构,这是个问题?
    ASP.NET 5中的ASP.NET Bundles跑到哪里去了?
    如何在ASP.NET MVC和EF中使用AngularJS
    在VS 2015中边调试边分析性能
    C#中的Infinity有个小坑
    利用Roslyn构建一个简单的C#交互脚本引擎
    移动端跨平台开发干货分享
    在ASP.NET 5中读取配置文件
    5个让你的SaaS应用大卖的技巧
    大数据技术之_19_Spark学习_08_Spark 机器学习_01_机器学习概述 + 机器学习的相关概念 + 算法常用指标
  • 原文地址:https://www.cnblogs.com/chrdai/p/7966640.html
Copyright © 2011-2022 走看看