在特定控制器方法中为dataprovider设置where条件

Spu*_*ous 9 search model dataprovider conditional-statements yii2

我期待为控制器中的单个动作设置条件,所以我不想改变我的search模型.

我的代码看起来像这样:

public function actionRoles()
    {
        $searchModel = new EmployeeSearch();
        //$searchModel->query()->where('role <> regular');
        $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

        return $this->render('view_role', [
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,
        ]);
    }
Run Code Online (Sandbox Code Playgroud)

通知行显示我的条件($searchModel->query()->where('role <> regular');),它非常简单,但我没有找到一个在线工作的解决方案.

作为参考,我试过这些:

Spu*_*ous 12

好的,我完成了它,它以这种方式为我工作:

public function actionRoles()
{
    $searchModel = new EmployeeSearch();

    $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
    $dataProvider->sort = ['defaultOrder' => ['role'=>SORT_ASC, 'fullname'=>SORT_ASC]];
    $dataProvider->query->where('employee.role <> \'regular\'');

    return $this->render('view_role', [
        'searchModel' => $searchModel,
        'dataProvider' => $dataProvider,
    ]);
}
Run Code Online (Sandbox Code Playgroud)

当然有点复杂并且在模型中做它可能会更好,但我只希望它在这个动作中使用它并且具有相同search模型但不同条件的一堆其他动作.


Kir*_*kov 8

你可以在Controller中这样做

$searchModel = new ModelSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
$dataProvider->query->andWhere(['lang'=>'ENG']);
Run Code Online (Sandbox Code Playgroud)


Hir*_*hut 4

你可以尝试这个方法

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

在搜索模型中:

$query->andFilterWhere(['<>', 'role', $this->role]);
Run Code Online (Sandbox Code Playgroud)

第二种方式传递第二个参数,例如:

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

在搜索模型中

if($role == 'regular') {
    $query->andWhere(['<>', 'role', $this->role]);
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是传递其他参数,但过滤时间存在问题:

$dataProvider = $searchModel->search(Yii::$app->request->queryParams+['EmployeeSearch' => ['<>', 'role' =>'regular']]);
Run Code Online (Sandbox Code Playgroud)