Yii2 GridView单列实现<、>、=多条件过滤的方案咨询
实现思路
你不需要额外引入自定义过滤器,按下面两步改造即可:
第一步:修改搜索模型的验证规则
原来的qnt是integer规则,会直接过滤掉带<、>的字符串,所以先把qnt从integer规则组里移出来,单独加匹配规则:
public function rules() { return [ // 把qnt从原来的integer数组里删掉 [['product_routing_id', 'qnt_worked', 'production_status_id', 'production_order_id', 'acceptance_order_id', 'customer_id', 'product_id', 'casting_id', 'trash'], 'integer'], // 单独给qnt加规则,允许合法的比较表达式 [['qnt'], 'match', 'pattern' => '/^\s*(<|>|<=|>=|=)?\s*\d+\s*$/i', 'message' => '请输入合法的数值或比较表达式,例如>500、<=1000'], ]; }
这个正则支持带空格的写法比如> 500也能正常匹配。
第二步:改造搜索方法里的过滤逻辑
在加andFilterWhere之前,先解析qnt的输入值,拆分出操作符和实际数值:
public function search($params) { $query = ProductionOrder::find(); // 这里换成你自己的查询类 $this->load($params); if (!$this->validate()) { // 验证失败的原有逻辑按需保留即可 return $dataProvider; } // 新增qnt表达式解析逻辑 if ($this->qnt) { if (preg_match('/^\s*(<|>|<=|>=|=)?\s*(\d+)\s*$/i', $this->qnt, $matches)) { $operator = $matches[1] ?? '='; // 没有指定操作符默认按等于匹配 $value = (int)$matches[2]; $query->andFilterWhere([$operator, 'production_order.qnt', $value]); } } // 其他原有过滤逻辑全部保留 // ... return $dataProvider; }
可选扩展
如果需要支持不等于的写法,比如!=500,只要把两处正则里的操作符部分改成(<|>|<=|>=|=|!=)即可。
内容的提问来源于stack exchange,提问作者Beholder88
相关产品推荐
相关产品推荐

