web-dev-qa-db-fra.com

Définir une condition where pour le fournisseur de données dans une méthode de contrôleur spécifique

Je cherche à définir une condition uniquement pour une action unique dans le contrôleur. Je ne souhaite donc pas modifier mon modèle search.

Mon code ressemble à ceci:

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

La rangée indiquée montre ma condition ($searchModel->query()->where('role <> regular');), elle est assez simple mais je n’ai pas trouvé de solution qui fonctionne en ligne.

Pour référence j'ai essayé ceux-ci:

8
Spurious

Ok, je l'ai fait, ça marche comme ça pour moi:

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

Certes, un peu compliqué et le faire dans le modèle serait probablement mieux, mais je veux seulement qu’il l’utilise dans cette action et ait un tas d’autres actions avec le même modèle search mais avec des conditions différentes.

12
Spurious

Vous pouvez le faire de cette façon dans le contrôleur

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

Vous pouvez essayer de cette façon 

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

Dans le modèle de recherche:

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

La seconde manière passe le second paramètre comme: 

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

Dans le modèle de recherche 

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

Une autre façon de passer un autre paramètre comme un problème de temps de filtrage:

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

Vous pouvez essayer ceci:
SearchModel:

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


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

Veuillez également visiter ce lien: http://www.yiiframework.com/doc-2.0/guide-output-data-providers.html

0
Ankush Rishi

Essayez comme ça en utilisant plusieurs paramètres - 

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

Essayez cette solution

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