如何在Yii1.1模型中实现两个字段二选一必填的验证规则?
Yii1.1 二选一互斥字段验证实现方案
Yii1.1 内置的验证规则没有直接支持「两个字段仅能填一个、不可同时为空也不可同时赋值」的互斥校验逻辑,你需要额外添加自定义验证规则来实现该需求,具体实现步骤如下:
1. 修改原有验证规则
首先去掉event_id字段自带的required规则,同时给新增的video_id字段加上整数格式校验,再绑定自定义验证方法:
public function rules(): array { return [ // 两个字段统一配置整数校验规则,非必填 ['event_id, video_id', 'numerical', 'integerOnly' => true], // 绑定自定义互斥验证规则 ['event_id', 'validateExclusiveField'], ]; }
2. 编写自定义验证方法
在模型中新增验证方法,判断两个字段的填充状态,不符合规则时抛出错误提示:
/** * 自定义验证:event_id和video_id必须二选一,不可同时为空或同时赋值 * @param string $attribute 当前触发验证的字段名 * @param array $params 额外传入的参数 */ public function validateExclusiveField($attribute, $params) { $eventFilled = !empty($this->event_id); $videoFilled = !empty($this->video_id); if (!$eventFilled && !$videoFilled) { $this->addError($attribute, 'event_id 和 video_id 必须填写其中一个'); } if ($eventFilled && $videoFilled) { $this->addError($attribute, 'event_id 和 video_id 仅能填写其中一个,不可同时赋值'); } }
补充说明
- 如果需要错误提示同时关联两个字段,可以分别给
event_id和video_id都调用addError方法抛出错误 - 如果你的模型使用了场景验证,记得把
video_id加入对应场景的安全属性列表,否则字段赋值会被Yii过滤
内容的提问来源于stack exchange,提问作者k0pernikus
相关产品推荐
相关产品推荐

