Yii2 searchModel中的search()是如何工作的?

njthzxwz  于 2022-11-09  发布在  其他
关注(0)|答案(3)|浏览(195)

有人能解释一下Yii 2 SearchModel中的search方法是如何工作的吗?我用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时使用什么属性,我总是得到相同的结果--即表中的所有条目。
任何帮助都将不胜感激。谢谢。

cunj1qz1

cunj1qz11#

  • 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)

i7uaboj4

i7uaboj42#

如果你想把一些额外的参数传递给search()方法,你可以在SomeSearch.php中这样修改search方法:

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

jdgnovmf3#

$searchModel = new CursadoSearch();
    $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
    $dataProvider->query->andWhere([ 'cursado.curso_id' => $curso_id]);

相关问题