27

请有人能解释一下searchYii2 中的方法是如何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,我总是得到相同的结果——即表中的所有条目。我在这里遗漏了一些我不明白的东西。

任何帮助将非常感激。谢谢。

4

2 回答 2

37

Gii生成的search()函数用于设置搜索参数:ActiveRecord::load()

load()除非给出参数,否则'FormName'从模型的formName()方法(您可以覆盖)获取。$formName如果表单名称为空,load()则使用整个 of 填充模型$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, '').

于 2014-02-14T12:49:43.910 回答
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,
   ]);
}
于 2018-06-08T06:18:16.333 回答