有人可以解释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
时使用什么属性,我总会得到相同的结果 - 即表中的所有条目。我在这里遗漏了一些我不明白的事情。
任何帮助都会非常感激。感谢。
答案 0 :(得分:35)
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]]);
当然,在att3
函数中添加search()
属性的条件:
$this->addCondition($query, 'att3');
但如果您真的想使用$myModels = $search->search(['att3' => '3']);
,那么您只需将$this->load($params)
替换为$this->load($params, '')
。
答案 1 :(得分:0)
如果你想要一些额外的参数传递给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,
]);
}