Tri par défaut du fournisseur de données Yii2

99

Dans Yii 1.1, ce code fonctionne pour le tri par défaut:

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

Comment le tri par défaut peut-il être défini dans Yii2?

J'ai essayé le code ci-dessous, mais aucun résultat:

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

Réponses:

175

Je pense qu'il existe une solution appropriée. Configurez l' yii\data\Sortobjet:

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

Lien vers la documentation officielle

Alex
la source
Cette solution fonctionne mais la recherche dans l'index ne fonctionne pas maintenant.
Roby Sottini
42

Ou

       $dataProvider->setSort([
        'defaultOrder' => ['topic_order'=>SORT_DESC],
        'attributes' => [...
Kristīne Glode
la source
1
Il est plus compatible avec la sortie GII par défaut
userlond
15

defaultOrder contient un tableau où key est un nom de colonne et la valeur est un SORT_DESCou SORT_ASCc'est pourquoi le code ci-dessous ne fonctionne pas.

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

Bonne manière

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

Remarque: Si une requête spécifie déjà la clause orderBy, les nouvelles instructions de classement données par les utilisateurs finaux (via la configuration de tri) seront ajoutées à la clause orderBy existante. Toutes les clauses de limite et de décalage existantes seront écrasées par la demande de pagination des utilisateurs finaux (via la configuration de pagination).

Vous pouvez détailler apprendre du guide Yii2 du fournisseur de données

Trier en passant l'objet Trier dans la requête

 $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();
Parth Chavda
la source
6

si vous avez CRUD (index) et que vous avez besoin de définir le tri par défaut de votre contrôleur pour GridView, ou ListView, ou plus ... Exemple

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,
    ]);
}

vous devez ajouter

$dataProvider->sort->defaultOrder = ['id' => SORT_DESC];
Andrey Matveev
la source
2

Essayez celui-ci

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

$sort = $dataProvider->getSort();

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

$dataProvider->setSort($sort);
user210195
la source
1
$dataProvider = new ActiveDataProvider([ 
    'query' => $query, 
    'sort'=> ['defaultOrder' => ['iUserId'=>SORT_ASC]] 
]);
Suraj Vaghela
la source
-1

vous pouvez modifier le modèle de recherche comme ceci

$dataProvider = new ActiveDataProvider([
        'query' => $query,
        'sort' => [
            'defaultOrder' => ['user_id ASC, document_id ASC']
        ]
    ]);
brahmeswara rao Kamineni
la source
-2
    $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]]
                                ]); 
jagjit singh
la source