You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 00:48:07