Yii2 SearchModel中的search()如何工作?

时间:2014-02-14 12:11:26

标签: php yii yii2

有人可以解释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时使用什么属性,我总会得到相同的结果 - 即表中的所有条目。我在这里遗漏了一些我不明白的事情。

任何帮助都会非常感激。感谢。

2 个答案:

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