web-dev-qa-db-ja.com

Yii2 SearchModelのsearch()はどのように機能しますか?

Yii2 searchSearchModelメソッドがどのように機能するかを誰かが説明できますか? Giiを使用して生成しました。ここにあります:

public function search($params){
    $query = MyModel::find();
    $dataProvider = new ActiveDataProvider([
        'query' => $query,
    ]);

    if (!($this->load($params) && $this->validate())) {
        return $dataProvider;
    }

    $this->addCondition($query, 'att1');
    $this->addCondition($query, 'att1', true);
    $this->addCondition($query, 'att2');
    $this->addCondition($query, 'att2', true);

    return $dataProvider;
}

これは私がそれを呼ぶ方法です:

$search = new MyModelSearch();
$myModels = $search->search(['att3' => '3']);

searchの呼び出しに使用する属性に関係なく、常に同じ結果、つまりテーブル内のすべてのエントリが返されます。私はここで私がただ理解していない何かを見逃しています。

どんな助けも本当に感謝されます。ありがとう。

27
Mr Goobri

Giiによって生成されたsearch()関数は、 ActiveRecord::load() を使用して検索パラメーターを設定します。

load()は、_'FormName'_パラメーターが指定されていない限り、モデルのformName()メソッド(オーバーライド可能)から_$formName_を取得します。フォーム名が空の場合、load()は、モデルに_$data_ではなく、_$data['FormName']_全体を取り込みます。

だからあなたは試してみてください:

_$myModels = $search->search(['MyModelSearch'=>['att3'=>3]]);
_

または

_$myModels = $search->search([$search->formName()=>['att3'=>3]]);
_

そしてもちろん、search()関数の_att3_属性に条件を追加します:

_$this->addCondition($query, 'att3');
_

しかし、本当に$myModels = $search->search(['att3' => '3']);を使用したい場合は、単に$this->load($params)$this->load($params, '')に置き換える必要があります。

35
soju

追加のパラメーターをsearch()メソッドに渡す場合は、SomeSearch.phpで次のように検索メソッドを変更できます。

public function search($params, $additional=0)
{
   //...
   if($additional==1) {
       $query->andWhere(['status'=>['some', 'other']);
   }
}

および内部コントローラー:

public function actionIndex()
{
   $searchModel = new AdminSearch();

   $additional=1;
   $dataProvider = $searchModel->search(Yii::$app->request->queryParams, $additional);

   return $this->render('index', [
      'searchModel' => $searchModel,
      'dataProvider' => $dataProvider,
   ]);
}
0
user3410311