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

2022-08-30 15:40:56

请问有人可以解释一下 Yii2 中的方法是如何工作的吗?我使用Gii生成了它。在这里:searchSearchModel

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

任何帮助将不胜感激。谢谢。


答案 1

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

load()从模型的方法中获取 (您可以重写),除非给定参数。如果窗体名称为空,则用 整个 填充模型,而不是 。'FormName'formName()$formNameload()$data$data['FormName']

所以你应该试试:

$myModels = $search->search(['MyModelSearch'=>['att3'=>3]]);

$myModels = $search->search([$search->formName()=>['att3'=>3]]);

当然,在函数中添加属性条件:att3search()

$this->addCondition($query, 'att3');

但是,如果您真的想使用,那么您应该简单地替换为.$myModels = $search->search(['att3' => '3']);$this->load($params)$this->load($params, '')


答案 2

如果您希望将一些额外的参数传递给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,
   ]);
}

推荐