【问题标题】:Yii2 Search model without using GridView不使用 GridView 的 Yii2 搜索模型
【发布时间】:2015-03-12 01:08:31
【问题描述】:

房地产中介的主页上有一个搜索表格。有关对象的数据存储在使用关系的表“realty”中。例如,有相关表 category(住宅、商业、地块)、deal(买、卖、租)、object_type(公寓、房子、办公室)。

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

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

【问题讨论】:

    标签: search gridview yii2


    【解决方案1】:

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

    解决方案 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 上调用 -&gt;getModels() 以获取实际记录。无需更改搜索功能。对数组做任何你想做的事情。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多