Yii2中校验数组参数需用each验证器,它遍历数组每个元素并执行指定规则;如['deleteIds', 'each', 'rule' => ['integer']]校验整数,支持嵌套min/max/exist等规则,并可通过skipOnEmpty控制空数组行为。

Yii2 中校验数组参数,核心是用 each 验证器。它不是直接校验整个数组是否合法,而是对数组里的每个元素单独执行指定的验证规则。
each 验证器的基本用法
当你有一个属性(比如 deleteIds)预期接收一个整数 ID 列表时,不能直接用 ['integer'],因为那是为单值设计的。必须包裹一层 each:
- 规则写法:
['deleteIds', 'each', 'rule' => ['integer']] - 框架会自动遍历
$model->deleteIds的每个元素,分别调用NumberValidator去判断是否为整数 - 只要有一个元素不满足,就会在
errors['deleteIds']中添加对应错误信息
给 each 嵌套带参数的规则
each 的 rule 值本身就是一个完整规则数组,支持所有常规配置项。例如要求每个 ID 是大于 0 的整数:
['deleteIds', 'each', 'rule' => ['integer', 'min' => 1]]- 这里
min是NumberValidator的属性,会被自动注入到内部验证器实例中 - 同理可加
max、tooSmall等自定义提示
校验数组元素是否存在于数据库
如果数组存的是用户 ID,想确保每个 ID 都真实存在,可以用 exist 配合 each:
['receiverIds', 'each', 'rule' => ['exist', 'targetClass' => User::class, 'targetAttribute' => 'id']]-
targetAttribute明确指定查User表的id字段,避免字段名不一致导致查询失败 - 注意:
exist默认只查单个值,each让它逐个查,性能上需留意大数据量场景
配合 skipOnEmpty 控制空数组行为
默认情况下,如果 deleteIds 是空数组([]),each 仍会执行——但因为没元素可遍历,实际不报错。如果你希望空数组也跳过验证,或相反,强制校验空数组,需显式设置:
- 允许为空时跳过:
'skipOnEmpty' => true(默认值,通常不用写) - 即使为空也要走验证逻辑(比如记录“未选择任何项”):
'skipOnEmpty' => false - 该选项作用于
deleteIds这个属性本身,不影响其内部元素的空值判断


















