房地产代理机构的主页上有一个serch表单。有关对象的数据存储在使用关系的表“realty”中。例如,有相关的表类别(住宅,商业,土地),交易(买,卖,租),object_type(公寓,房子,办公室)。
然后,不同的类别具有不同的属性,并且搜索表单中有三个引导选项卡:住宅,商业,土地。在每个选项卡下,都有特定于选择选项卡的选择和输入字段。
在大多数情况下,使用搜索模型的示例在gridview中给出。 是否可以调整搜索模型逻辑,以便它可以根据主页上搜索表单中指示的值从表'不动产'返回结果数组?
答案 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