web-dev-qa-db-de.com

Legen Sie eine Where-Bedingung für den Datenprovider in einer bestimmten Controller-Methode fest

Ich möchte eine Bedingung nur für eine einzelne Aktion im Controller festlegen, daher möchte ich mein Modell search nicht ändern.

Mein Code sieht so aus:

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

Die Zeile mit dem Kommentar zeigt meinen Zustand ($searchModel->query()->where('role <> regular');), es ist ziemlich einfach, aber ich habe keine Lösung gefunden, die online funktioniert.

Als Referenz habe ich die probiert:

8
Spurious

Ok, ich habe es geschafft, es funktioniert für mich so:

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

Sicherlich ein bisschen kompliziert und das Ausführen im Modell wäre wahrscheinlich besser, aber ich möchte nur, dass es in dieser Aktion verwendet wird und eine Reihe anderer Aktionen mit demselben search-Modell, aber unterschiedlichen Bedingungen hat.

12
Spurious

Sie können dies auf dem Controller tun

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

Sie können diesen Weg versuchen 

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

Im Suchmodell:

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

Zweiter Weg übergeben Sie den zweiten Parameter wie: 

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

Im Suchmodell 

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

Eine andere Möglichkeit, andere Parameter wie, aber Problem in der Filterzeit zu übergeben:

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

Sie können dies versuchen:
SearchModel:

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


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

Bitte besuchen Sie auch diesen Link: http://www.yiiframework.com/doc-2.0/guide-output-data-providers.html

0
Ankush Rishi

Versuchen Sie es mit Multi-Params - 

$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

Versuchen Sie diese Lösung

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