多值列表中的Yi2 gridview过滤器(非下拉列表过滤器)
我的gridview数据多值列表中的Yi2 gridview过滤器(非下拉列表过滤器),gridview,yii2,yii2-basic-app,Gridview,Yii2,Yii2 Basic App,我的gridview数据 day modeler total 2018-1-05 ABC 5 2018-1-06 DEF 8 2018-1-06 CAB 3 2018-1-06 GHI 3 2018-1-06 KLM 3 我有一
day modeler total
2018-1-05 ABC 5
2018-1-06 DEF 8
2018-1-06 CAB 3
2018-1-06 GHI 3
2018-1-06 KLM 3
我有一个这样的网格视图。现在只能逐个筛选modeler。我可以有一个多行搜索框,只需粘贴在“ABC DEF CAB”中,它将过滤3个结果,如下所示
day modeler total
2018-1-05 ABC 5
2018-1-06 DEF 8
2018-1-06 CAB 3
我的控制器
public function actionIndex()
{
$searchModel = new ModelerSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);
}
我的搜索模型
public function search($params)
{
$query = Modeler::find();
// add conditions that should always apply here
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);
$this->load($params);
if (!$this->validate()) {
// uncomment the following line if you do not want to return any records when validation fails
// $query->where('0=1');
return $dataProvider;
}
// grid filtering conditions
$query->andFilterWhere([
'id' => $this->id,
]);
$query->andFilterWhere(['like', 'modeler', $this->modeler])
->andFilterWhere(['like', 'total', $this->total]);
return $dataProvider;
}
}
谢谢大家! 您需要通过gridview中的
modeler
字段进行搜索,您希望它的工作方式是,如果您输入“ABC”
,它应该显示您匹配的记录,如果您输入“ABC DEF”
,并带有空格,它应该显示两条与其中任何一条匹配的记录
因此,首先,在您的搜索模型之上添加
private $_selections = [];
然后将搜索功能更新为以下内容
public function search( $params ) {
$query = Modeler::find ();
// add conditions that should always apply here
$dataProvider = new ActiveDataProvider ( [
'query' => $query ,
] );
$this->load ( $params );
if ( !$this->validate () ) {
// uncomment the following line if you do not want to return any records when validation fails
// $query->where('0=1');
return $dataProvider;
}
if ( $this->modeler !== null && $this->modeler !== '' ) {
$this->_selections = preg_split ( '/\s+/i' , $this->modeler );
$query->andFilterWhere ( [ 'IN' , 'modeler' , $this->_selections ] );
}
// grid filtering conditions
$query->andFilterWhere ( [
'id' => $this->id ,
] );
$query->andFilterWhere ( [ 'like' , 'total' , $this->total ] );
return $dataProvider;
}
现在转到您的gridview,在过滤器输入的
modeler
列中键入“ABC DEF”,并观察它的发生。无法理解“当前我逐个过滤模型”是什么意思?我可以只过滤“ABC”或“DEF”所以我理解的是,如果您输入“ABC”,您需要一个文本字段
它应该向您显示匹配的记录,如果您输入带有空格的“ABC DEF”它应该向您显示两条与其中任何一条匹配的记录?如果正确,您需要添加与您的搜索模型
、视图
和控制器操作
相关的代码,抱歉更新太晚。我使用Gii生成积垢。我想我不需要添加代码:)我知道,但是为了建议更新,我不会编写所有的代码:),所以最好您添加相关的代码,我会在需要的地方相应地更新它,这样您就可以替换您端的代码并测试它是否正确,所以请添加控制器操作和搜索()SearchModel
@SaoHo我更新了答案有一个额外的检查第二个检查可以替换为第一个检查如果($this->modeler!==null&&$this->modeler!==''){
那么我们可以将行移动到$query->和filterwhere(['IN',modeler',$this->searchQuery])
在它里面。查看更新的代码。是的,我找到了:)谢谢,顺便说一下,我尝试过过滤1000个建模器,它返回错误,URL长度超过了容量限制。你知道我是否可以通过增加限制来修复它吗?你在控制台中遇到了针对ajax请求的错误吗Apache服务器在URL中仅支持4000个字符。如果我过滤了很多值,它会返回这个错误。我可以使用“POST”而不是“GET”方法来搜索模型吗?如果不可以,那就没问题了:)可以,但是你需要在控制器操作中更改queryParams以POST,并更改pjax的选项。请参阅此POST@SaoHo