YII2:搜索模型中的自定义排序

osh*_*hka 0 sorting yii2

请帮我解决这样的问题:

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

Run Code Online (Sandbox Code Playgroud)

据我了解,我必须更改此行中的搜索参数,以添加排序条件

$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
Run Code Online (Sandbox Code Playgroud)

但我到底该怎么做呢?

Mic*_*ica 5

您可以通过将以下代码添加到您的操作中来做到这一点:

$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];
Run Code Online (Sandbox Code Playgroud)

field 函数返回第一个参数在其他参数中的位置,如果该值不存在,则返回 0。因此,对于“admin”,它将返回 2,对于“finance”,则返回 1,对于其他,则返回 0。如果您以此顺序订购 DESC,您将获得所需的订单。

另一种选择是将此定义添加到 UserSearch 模型的搜索方法中,如mahsaa 的答案中所建议的那样。这取决于您是否想在不同的操作中使用这种排序。