Yii2搜索模型,不使用GridView

时间:2015-03-12 01:08:31

标签: search gridview yii2

房地产代理机构的主页上有一个serch表单。有关对象的数据存储在使用关系的表“realty”中。例如,有相关的表类别(住宅,商业,土地),交易(买,卖,租),object_type(公寓,房子,办公室)。

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

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

1 个答案:

答案 0 :(得分:4)

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

解决方案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,更好的解决方案

在这里阅读第一个例子http://www.yiiframework.com/doc-2.0/yii-data-activedataprovider.html。您可以在ActiveDataProvider上调用->getModels()来获取实际记录。搜索功能无需更改。用数组做任何你想做的事。

解决方案3以及我一直使用的内容

将ActiveDataProvider与ListView一起使用。列表视图允许您创建所需的记录列表,它不必是表。我个人在很多地方这样做,效果很好。我有时将数组转换为ArrayDataProvider只是为了使用它。有关数据提供者的更多信息,请访问:http://www.yiiframework.com/doc-2.0/guide-output-data-providers.html