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

Yii2框架compare验证规则失效问题求助

Yii2 num2大于num1验证失效问题解决

问题重现

使用Yii2框架,模型包含num1、num2、num3三个字段,添加compare验证规则确保num2 > num1:

return [
    [['num1', 'num2', 'num3'], 'required'],
    [['num1', 'num2', 'num3'], 'integer', 'min' => self::MIN_SIZE, 'max' => self::MAX_SIZE],  
    ['num2', 'compare', 'compareAttribute' => 'num1', 'operator' => '>'],
];

输入8、9、10时验证正常,但输入8、10、11时验证失效,已将输入类型设为number。

问题原因

Yii2的compare验证器默认使用字符串比较而非数值比较。当num1为8、num2为10时,字符串比较会判定"10" < "8"(因字符"1"的ASCII码小于"8"),导致前端验证错误拦截,出现“验证失效”现象。

解决方案

1. 指定compare验证器为数值类型

修改验证规则,添加type参数设置为number,强制前后端按数值类型比较:

return [
    [['num1', 'num2', 'num3'], 'required'],
    [['num1', 'num2', 'num3'], 'integer', 'min' => self::MIN_SIZE, 'max' => self::MAX_SIZE],  
    ['num2', 'compare', 'compareAttribute' => 'num1', 'operator' => '>', 'type' => 'number'],
];

2. 强制字段转为整数(可选)

在模型的beforeValidate方法中,将num1和num2强制转为整数,确保验证时为数值类型:

public function beforeValidate()
{
    $this->num1 = (int)$this->num1;
    $this->num2 = (int)$this->num2;
    return parent::beforeValidate();
}

验证效果

修改后,输入8、10、11时,验证器会按数值逻辑判定10 > 8,验证正常通过。

内容的提问来源于stack exchange,提问作者Omi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 16:05:22