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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 22:45:03