Yii2 search
のSearchModel
メソッドがどのように機能するかを誰かが説明できますか? 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
の呼び出しに使用する属性に関係なく、常に同じ結果、つまりテーブル内のすべてのエントリが返されます。私はここで私がただ理解していない何かを見逃しています。
どんな助けも本当に感謝されます。ありがとう。
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, '')
に置き換える必要があります。
追加のパラメーターを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,
]);
}