【问题标题】:skip yii2 unique validation on update action if new value equals to prev value如果新值等于先前值,则跳过 yii2 更新操作的唯一验证
【发布时间】:2016-11-08 11:09:36
【问题描述】:

由于唯一验证器在更新操作时出错(“此用户名已被使用”)我想在新用户名值不等于上一个值时验证用户名更新操作,这是我的规则:

        [['username'], 'unique', 'on'=>'update', 'when' => function($model){
                return static::getOldUsername($model->id) !== $model->username;
            }
        ],

我的功能是获取上一个用户名值:

public static function getOldUsername($id)
{
    return static::findIdentity($id)->username;
}

但它不起作用,我认为 $model->getId() 没有返回任何内容,因为它使用静态 id(例如:23)。

        [['username'], 'unique', 'on'=>'update', 'when' => function($model){
                return static::getOldUsername(23) !== $model->username;
            }
        ],

我如何获得模型 ID?或者如果您有其他方法可以跳过 yii2 更新操作的唯一验证,如果新值等于上一个值,请解释一下。

提前致谢

【问题讨论】:

    标签: yii2 yii2-validation


    【解决方案1】:

    我觉得你可以用$user->isAttributeChanged('username');

    示例(我没有测试此代码):

    [['username'], 'unique', 'on'=>'update', 'when' => function($model){
        return $model->isAttributeChanged('username')
    }],
    

    【讨论】:

      【解决方案2】:

      我应该说我的代码是正确的,现在运行良好,错误来自 ,。哎呀!!

      我希望这个问题对其他观众有用,谢谢。

      【讨论】:

      • 非常有用:-)
      【解决方案3】:
      [
          'login', 'unique', 
          'targetAttribute' => ['login'], 
          'filter' => ['!=', 'id', Yii::$app->request->get('id')], 
          'targetClass' => '\app\models\User', 
          'message' => 'This login has already been taken.',
      ],
      

      【讨论】:

      • 虽然此代码可能会回答问题,但提供有关 如何 和/或 为什么 解决问题的附加上下文将改善答案的长期性价值。
      猜你喜欢
      • 2023-04-05
      • 2014-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-30
      • 2020-09-21
      • 2017-07-25
      相关资源
      最近更新 更多