Yii2 数据提供者默认排序

Posted

技术标签:

【中文标题】Yii2 数据提供者默认排序【英文标题】:Yii2 data provider default sorting 【发布时间】: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']
]);

【问题讨论】:

【参考方案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]] 
]);

【讨论】:

以上是关于Yii2 数据提供者默认排序的主要内容,如果未能解决你的问题,请参考以下文章

Yii2 ListView 和数据提供者

yii2 数据提供者查询需要很长时间

Yii2 数据提供者如何返回过去 24 小时的结果

Yii2 - 仅当记录是新的时才使用默认值

Yii2 DetailView小部件

yii2模板