Spurious
Spurious

Reputation: 2005

Set a where condition for dataprovider in specific controller method

I am looking to set a condition only for a single action in the controller, so I don't want to change my search model.

My code looks like this:

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

The commmented row shows my condition ($searchModel->query()->where('role <> regular');), it's pretty straightforward but I have not found a solution that works online.

For reference I tried those:

Upvotes: 12

Views: 25795

Answers (6)

Rohit Suthar
Rohit Suthar

Reputation: 3628

Try like this using multi-params -

$searchModel = new YourSearchModel();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
$dataProvider->query->where('field1 = :field1 AND field2 = :field2', [':field1' => 1, ':field2' => 'A']);

Upvotes: 0

Kirill Ryzhkov
Kirill Ryzhkov

Reputation: 522

You can do it this way in the Controller

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

Upvotes: 11

Lalit Mohan
Lalit Mohan

Reputation: 484

Try this solution

$searchModel = new ModelnameSearch
           (
              [ 'Attribute' => 1,
               'SecondAttribte' => '1',
              ]
           );

Upvotes: 0

Spurious
Spurious

Reputation: 2005

Ok, I got it done, it works this way for me:

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

Certainly a bit complicated and doing it in the model would probably be better, but I only want it to use it in this action and have a bunch of other actions with the same searchmodel but different conditions.

Upvotes: 15

Ankush Rishi
Ankush Rishi

Reputation: 3160

You can try this:
SearchModel:

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


    $query->andFilterWhere(['<>', 'role'=>'regular']);
return $this->render('view_role', [
        'searchModel' => $searchModel,
        'dataProvider' => $dataProvider,
    ]);

Please also visit this link:http://www.yiiframework.com/doc-2.0/guide-output-data-providers.html

Upvotes: 0

Hiren Bhut
Hiren Bhut

Reputation: 1226

You can try this way

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

In Search model :

$query->andFilterWhere(['<>', 'role', $this->role]);

Second way pass second parameter like :

$dataProvider = $searchModel->search(Yii::$app->request->queryParams, $role = 'regular');

In search model

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

Another way pass other parameter like but problem in filter time:

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

Upvotes: 4

Related Questions