Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Search 不使用GridView的Yii2搜索模型_Search_Gridview_Yii2 - Fatal编程技术网

Search 不使用GridView的Yii2搜索模型

Search 不使用GridView的Yii2搜索模型,search,gridview,yii2,Search,Gridview,Yii2,在房地产代理的主页上有一个serch表格。有关对象的数据存储在使用关系的表realty中。例如,有相关表格分类住宅、商业、地块、交易买卖、租赁、对象类型公寓、房屋、办公室 然后,不同的类别具有不同的属性,并且在搜索表单中有三个引导选项卡:住宅、商业、地块。每个选项卡下都有特定于choosen选项卡的选择和输入字段 在大多数情况下,使用搜索模型的示例都在gridview中给出。 是否可以调整搜索模型逻辑,以便根据主页上搜索表单中指示的值从表“realty”返回结果数组?是的,当然可以。您有几个选择

在房地产代理的主页上有一个serch表格。有关对象的数据存储在使用关系的表realty中。例如,有相关表格分类住宅、商业、地块、交易买卖、租赁、对象类型公寓、房屋、办公室

然后,不同的类别具有不同的属性,并且在搜索表单中有三个引导选项卡:住宅、商业、地块。每个选项卡下都有特定于choosen选项卡的选择和输入字段

在大多数情况下,使用搜索模型的示例都在gridview中给出。
是否可以调整搜索模型逻辑,以便根据主页上搜索表单中指示的值从表“realty”返回结果数组?

是的,当然可以。您有几个选择:

解决方案1-最差的解决方案,但答案是您的问题

修改模型的搜索功能或创建新功能。搜索函数通常如下所示

public function search($params)
{
    $query = Bookmark::find()->where('status <> "deleted"');
    $dataProvider = new ActiveDataProvider([
        'query' => $query,
        'pagination' => [
            'pageSize' => Yii::$app->session->get(get_parent_class($this) . 'Pagination'),
        ],
    ]);
    if (!($this->load($params) && $this->validate())) {
        return $dataProvider;
    }

    $query->andFilterWhere([
        'status' => $this->status,
        'id' => $this->id,
        'reminder' => $this->reminder,
        'order' => $this->order,
        'update_time' => $this->update_time,
        'update_by' => $this->update_by,
        'create_time' => $this->create_time,
        'create_by' => Yii::$app->user->id,
    ]);
    $query->andFilterWhere(['like', 'name', $this->name])
        ->andFilterWhere(['like', 'url', $this->url]);
    return $dataProvider;
}
你可以把它改成

public function search($params)
{
    $query = Bookmark::find()->where('status <> "deleted"');
    if (!($this->load($params) && $this->validate())) {
        THROW AN ERROR SOMEHOW HERE
    }

    $query->andFilterWhere([
        'status' => $this->status,
        'id' => $this->id,
        'reminder' => $this->reminder,
        'order' => $this->order,
        'update_time' => $this->update_time,
        'update_by' => $this->update_by,
        'create_time' => $this->create_time,
        'create_by' => Yii::$app->user->id,
    ]);
    $query->andFilterWhere(['like', 'name', $this->name])
        ->andFilterWhere(['like', 'url', $this->url]);
    return $query->all();

}
但是,这将返回所有记录,因为ActiveDataProvider负责基于给定查询的分页

解决方案2,更好的解决方案

阅读这里的第一个例子。您可以在ActiveDataProvider上调用->getModels以获取实际记录。无需对搜索功能进行任何更改。对数组执行任何操作

解决方案3和我一直在使用的内容


将ActiveDataProvider与ListView一起使用。列表视图允许您创建记录列表,但不必是表。我个人在很多地方都这样做,效果很好。有时我将数组转换为ArrayDataProvider只是为了使用它。关于数据提供者的更多信息,请点击此处:

是的,当然可以。您有几个选择:

解决方案1-最差的解决方案,但答案是您的问题

修改模型的搜索功能或创建新功能。搜索函数通常如下所示

public function search($params)
{
    $query = Bookmark::find()->where('status <> "deleted"');
    $dataProvider = new ActiveDataProvider([
        'query' => $query,
        'pagination' => [
            'pageSize' => Yii::$app->session->get(get_parent_class($this) . 'Pagination'),
        ],
    ]);
    if (!($this->load($params) && $this->validate())) {
        return $dataProvider;
    }

    $query->andFilterWhere([
        'status' => $this->status,
        'id' => $this->id,
        'reminder' => $this->reminder,
        'order' => $this->order,
        'update_time' => $this->update_time,
        'update_by' => $this->update_by,
        'create_time' => $this->create_time,
        'create_by' => Yii::$app->user->id,
    ]);
    $query->andFilterWhere(['like', 'name', $this->name])
        ->andFilterWhere(['like', 'url', $this->url]);
    return $dataProvider;
}
你可以把它改成

public function search($params)
{
    $query = Bookmark::find()->where('status <> "deleted"');
    if (!($this->load($params) && $this->validate())) {
        THROW AN ERROR SOMEHOW HERE
    }

    $query->andFilterWhere([
        'status' => $this->status,
        'id' => $this->id,
        'reminder' => $this->reminder,
        'order' => $this->order,
        'update_time' => $this->update_time,
        'update_by' => $this->update_by,
        'create_time' => $this->create_time,
        'create_by' => Yii::$app->user->id,
    ]);
    $query->andFilterWhere(['like', 'name', $this->name])
        ->andFilterWhere(['like', 'url', $this->url]);
    return $query->all();

}
但是,这将返回所有记录,因为ActiveDataProvider负责基于给定查询的分页

解决方案2,更好的解决方案

阅读这里的第一个例子。您可以在ActiveDataProvider上调用->getModels以获取实际记录。无需对搜索功能进行任何更改。对数组执行任何操作

解决方案3和我一直在使用的内容

将ActiveDataProvider与ListView一起使用。列表视图允许您创建记录列表,但不必是表。我个人在很多地方都这样做,效果很好。有时我将数组转换为ArrayDataProvider只是为了使用它。有关数据提供商的更多信息,请参见: