web-dev-qa-db-ja.com

特定のコントローラーメソッドでデータプロバイダーのwhere条件を設定する

コントローラー内の単一のアクションに対してのみ条件を設定したいので、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,
        ]);
    }
_

コメントされた行は私の状態($searchModel->query()->where('role <> regular');)を示しています。これはかなり単純ですが、オンラインで機能する解決策を見つけていません。

参考までに私はそれらを試しました:

10
Spurious

OK、私はそれを成し遂げました、それは私にとってこのように機能します:

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

確かに少し複雑で、モデルでそれを行う方がおそらく良いでしょうが、私はそれをこのアクションで使用し、同じsearchmodelであるが異なる条件を持つ他のアクションの束があることだけを望みます。

13
Spurious

コントローラでこのようにすることができます

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

あなたはこの方法を試すことができます

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

検索モデル:

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

2番目の方法は次のように2番目のパラメータを渡します:

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

検索モデル

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

別の方法では、他のパラメーターを渡しますが、フィルター時間に問題があります。

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

あなたはこれを試すことができます:
SearchModel:

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


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

このリンクもご覧ください: http://www.yiiframework.com/doc-2.0/guide-output-data-providers.html

0
Ankush Rishi

マルチパラメータを使用してこのようにしてみてください-

$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

この解決策を試してください

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