【问题标题】:Yii2 data provider default sortingYii2 数据提供者默认排序
【发布时间】:2014-05-24 11:57:51
【问题描述】:

在 Yii 1.1 中,此代码适用于默认排序:

$dataProvider = new CActiveDataProvider('article',array(
    'sort'=>array(
        'defaultOrder'=>'id DESC',
    ),
));

如何在 Yii2 中设置默认排序?

尝试以下代码,但没有结果:

$dataProvider = new ActiveDataProvider([
    'query' => $query,
    'sort' => ['defaultOrder'=>'topic_order asc']
]);

【问题讨论】:

    标签: php yii yii2 gridview-sorting


    【解决方案1】:

    我认为有适当的解决方案。配置yii\data\Sort对象:

     $dataProvider = new ActiveDataProvider([
         'query' => $query,
         'sort'=> ['defaultOrder' => ['topic_order' => SORT_ASC]],
     ]);
    

    Official doc link

    【讨论】:

    • 此解决方案有效,但索引中的搜索现在不起作用。
    【解决方案2】:

    或者

           $dataProvider->setSort([
            'defaultOrder' => ['topic_order'=>SORT_DESC],
            'attributes' => [...
    

    【讨论】:

    • 与默认的 GII 输出更兼容
    【解决方案3】:

    defaultOrder 包含一个数组,其中键是列名,值是 SORT_DESCSORT_ASC,这就是下面代码不起作用的原因。

    $dataProvider = new ActiveDataProvider([
            'query' => $query,
            'sort' => ['defaultOrder'=>'topic_order asc']
        ]);
    

    正确方法

    $dataProvider = new ActiveDataProvider([
        'query' => $query,
        'sort' => [
            'defaultOrder' => [
                'topic_order' => SORT_ASC,
            ]
        ],
    ]);
    

    注意:如果查询已经指定了 orderBy 子句,则最终用户(通过排序配置)给出的新排序指令将附加到现有的 orderBy 子句中。任何现有的限制和偏移子句都将被最终用户的分页请求覆盖(通过分页配置)。

    你可以详细学习 Yii2 Guide of Data Provider

    通过在查询中传递排序对象进行排序

     $sort = new Sort([
            'attributes' => [
                'age',
                'name' => [
                    'asc' => ['first_name' => SORT_ASC, 'last_name' => SORT_ASC],
                    'desc' => ['first_name' => SORT_DESC, 'last_name' => SORT_DESC],
                    'default' => SORT_DESC,
                    'label' => 'Name',
                ],
            ],
        ]);
    
        $models = Article::find()
            ->where(['status' => 1])
            ->orderBy($sort->orders)
            ->all();
    

    【讨论】:

      【解决方案4】:

      你可以像这样修改搜索模型

      $dataProvider = new ActiveDataProvider([
              'query' => $query,
              'sort' => [
                  'defaultOrder' => ['user_id ASC, document_id ASC']
              ]
          ]);
      

      【讨论】:

        【解决方案5】:

        试试这个

        $dataProvider = new ActiveDataProvider([
            'query' => $query,
        ]);
        
        $sort = $dataProvider->getSort();
        
        $sort->defaultOrder = ['id' => SORT_ASC];
        
        $dataProvider->setSort($sort);
        

        【讨论】:

          【解决方案6】:

          如果您有 CRUD(索引)并且您需要为 GridView、ListView 或更多设置默认排序控制器... 示例

          public function actionIndex()
          {
              $searchModel = new NewsSearch();
              $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
              // set default sorting
              $dataProvider->sort->defaultOrder = ['id' => SORT_DESC];
          
              return $this->render('index', [
                  'searchModel' => $searchModel,
                  'dataProvider' => $dataProvider,
              ]);
          }
          

          你需要添加

          $dataProvider->sort->defaultOrder = ['id' => SORT_DESC];
          

          【讨论】:

          • 如果你想在控制器中做到这一点而不改变 SearchModel,这是要走的路。谢谢!
          【解决方案7】:
              $modelProduct       =   new Product();
              $shop_id            =   (int)Yii::$app->user->identity->shop_id;
          
              $queryProduct       =   $modelProduct->find()
                                      ->where(['product.shop_id'  => $shop_id]);
          
          
              $dataProviderProduct    =   new ActiveDataProvider([
                                              'query'         =>  $queryProduct,
                                               'pagination' => [ 'pageSize' => 10 ],
                                              'sort'=> ['defaultOrder' => ['id'=>SORT_DESC]]
                                          ]); 
          

          【讨论】:

            【解决方案8】:
            $dataProvider = new ActiveDataProvider([ 
                'query' => $query, 
                'sort'=> ['defaultOrder' => ['iUserId'=>SORT_ASC]] 
            ]);
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2010-09-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多