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

Mr *_*bri 28 php yii yii2

有人可以解释一下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;
}
Run Code Online (Sandbox Code Playgroud)

这就是我所说的:

$search = new MyModelSearch();
$myModels = $search->search(['att3' => '3']);
Run Code Online (Sandbox Code Playgroud)

无论我在调用中使用什么属性search,我总是得到相同的结果 - 即表中的所有条目.我在这里遗漏了一些我不明白的东西.

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

soj*_*oju 36

search()所产生的功能GII使用ActiveRecord::load()设置的搜索参数:

load()得到'FormName'从模型的formName()方法(你可以重写),除非$formName指定参数.如果表单名称为空,load()则使用整个表单填充模型$data,而不是$data['FormName'].

所以你应该尝试:

$myModels = $search->search(['MyModelSearch'=>['att3'=>3]]);
Run Code Online (Sandbox Code Playgroud)

要么

$myModels = $search->search([$search->formName()=>['att3'=>3]]);
Run Code Online (Sandbox Code Playgroud)

当然att3search()函数中添加一个条件:

$this->addCondition($query, 'att3');
Run Code Online (Sandbox Code Playgroud)

但是,如果你真的想使用$myModels = $search->search(['att3' => '3']);,那么你应该只需更换$this->load($params)$this->load($params, '').