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

Yii2新手求助:如何让插入验证规则同步作用于更新操作?

解决Yii2中插入验证规则同步到更新操作的问题

嘿,别担心,我来帮你理清楚Yii2验证规则和场景的用法~

首先得纠正一个小误解:Yii2中,没有指定on属性的验证规则,默认会在所有场景生效,包括insert(插入)和update(更新)。所以你现在写的规则其实已经会在更新操作中生效了!

你之前尝试添加'on' => 'update'反而会让这条规则只在更新场景生效,插入场景时反而不验证了,这显然不是你想要的效果。

正确的处理方式分两种情况:

  1. 让所有规则在插入和更新时都生效(这正是你需要的)
    直接保留你原来的规则即可,不需要加任何on属性。默认情况下,这些规则会自动覆盖insert和update场景:

    public $tag;
    public function rules() {
        return [
            [['user_id', 'name', 'address', 'state'], 'required'],
            [['user_id'], 'integer'],
            [['tag'], 'safe'],
            [['name'], 'string', 'max' => 30],
            [['address'], 'string', 'max' => 250],
            [['state'], 'string', 'max' => 255],
        ];
    }
    
  2. 如果需要明确指定规则生效的场景(比如防止其他自定义场景干扰)
    如果你想明确声明这些规则只在insert和update场景生效,可以给规则加上on属性并传入场景数组:

    public function rules() {
        return [
            [['user_id', 'name', 'address', 'state'], 'required', 'on' => ['insert', 'update']],
            [['user_id'], 'integer', 'on' => ['insert', 'update']],
            [['tag'], 'safe', 'on' => ['insert', 'update']],
            [['name'], 'string', 'max' => 30, 'on' => ['insert', 'update']],
            [['address'], 'string', 'max' => 250, 'on' => ['insert', 'update']],
            [['state'], 'string', 'max' => 255, 'on' => ['insert', 'update']],
        ];
    }
    

    不过这种写法有点冗余,因为默认行为就是这样,所以第一种方式更简洁。

额外检查点:

确保你在控制器的更新方法中,没有手动修改模型的场景。比如下面是标准的更新方法写法,这样会自动使用update场景并触发验证:

public function actionUpdate($id)
{
    $model = $this->findModel($id);

    if ($model->load(Yii::$app->request->post()) && $model->save()) {
        return $this->redirect(['view', 'id' => $model->id]);
    }

    return $this->render('update', [
        'model' => $model,
    ]);
}

如果你的代码里有类似$model->scenario = 'custom_scenario'这样的语句,会导致验证规则只应用到自定义场景,这时候就需要调整场景设置啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:56:31