php Yii2 数据提供者默认排序

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/22993777/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-25 16:25:09  来源:igfitidea点击:

Yii2 data provider default sorting

phpyiiyii2gridview-sorting

提问by Sarvar Nishonboev

In Yii 1.1 this code works for default sorting:

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

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

How default sorting can be set in Yii2?

Yii2中如何设置默认排序?

Tried below code, but no result:

试过下面的代码,但没有结果:

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

回答by Alex

I think there's proper solution

我认为有适当的解决方案

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

Official doc link

官方文档链接

回答by Kristīne Glode

Or

或者

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

回答by Parth Chavda

defaultOrdercontain a array where key is a column name and value is a SORT_DESCor SORT_ASCthat's why below code not working.

defaultOrder包含一个数组,其中键是列名,值是 a SORT_DESC或者 SORT_ASC这就是为什么下面的代码不起作用。

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

Correct Way

正确方式

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

Note: If a query already specifies the orderBy clause, the new ordering instructions given by end users (through the sort configuration) will be appended to the existing orderBy clause. Any existing limit and offset clauses will be overwritten by the pagination request from end users (through the pagination configuration).

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

You can detail learn from Yii2 Guide of Data Provider

你可以详细学习 Yii2数据提供者指南

Sorting By passing Sort object in query

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

 $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();

回答by Andrey Matveev

if you have CRUD (index) and you need set default sorting your controller for GridView, or ListView, or more... Example

如果您有 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,
    ]);
}

you need add

你需要添加

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

回答by user210195

Try to this one

试试这个

$dataProvider = new ActiveDataProvider([
    'query' => $query,
]);

$sort = $dataProvider->getSort();

$sort->defaultOrder = ['id' => SORT_ASC];

$dataProvider->setSort($sort);

回答by Suraj Vaghela

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

回答by brahmeswara rao Kamineni

you can modify search model like this

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

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

回答by jagjit singh

    $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]]
                                ]);