YII2: пользовательская сортировка в поисковой модели - PullRequest
0 голосов
/ 01 ноября 2019

Пожалуйста, помогите мне с такой проблемой:

1) У меня есть модель поиска по умолчанию для пользователей.

2) Мне нужен список пользователей. И сначала в этом списке всегда должен быть пользователь с логином ' admin ', а второй - с логином ' finance ', а затем все остальные, отсортированные по id.

Мой метод в UserController

public function actionUsersList() {
           $searchModel = new UserSearch();
    $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

    return $this->renderPartial('users-list', [
        'searchModel' => $searchModel,
        'dataProvider' => $dataProvider,
    ]);
}

Как я понял, мне нужно изменить параметры поиска в этой строке, чтобы добавить условия сортировки

$dataProvider = $searchModel->search(Yii::$app->request->queryParams);

Но как именно я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 01 ноября 2019

Вы можете сделать это, добавив следующий код к вашему действию:

$dataProvider->sort->attributes['id'] = [
    'asc' => [
        new \yii\db\Expression("FIELD(login, 'finance', 'admin') DESC"),
        'id' => SORT_ASC,
     ],
     'desc' => [
         new \yii\db\Expression("FIELD(login, 'finance', 'admin') DESC"),
         'id' => SORT_DESC,
     ],
     'label' => $searchModel->getAttributeLabel('id'),
];

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

Функция поля возвращает позицию первого параметра среди других параметров или 0, если значение отсутствует среди них. Таким образом, для 'admin' он вернет 2, для 'finance' 1 и для других 0. Если вы закажете DESC таким образом, вы получите требуемый заказ.

Другой вариант - добавить эти определения для сортировки вметод поиска модели UserSearch, предложенный в mahsaa's answer. Зависит от того, хотите ли вы использовать эту сортировку в разных действиях.

0 голосов
/ 01 ноября 2019

В UserSearch классе добавьте sort к ActiveDataProvider:

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

Сначала выполняется сортировка по имени входа, а затем по идентификатору.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...