请帮我解决这样的问题:
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)
但我到底该怎么做呢?
您可以通过将以下代码添加到您的操作中来做到这一点:
$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 的答案中所建议的那样。这取决于您是否想在不同的操作中使用这种排序。