如何检查我的字段`username`在表'User`中的唯一,除了当前用户在Yii2中的用户名

时间:2016-07-07 19:08:21

标签: validation yii2

在视图中,我的字段username始终由当前用户的用户名填充。并且它总是(在提交时)将用户名值发送到我的InformationForm并在下一个唯一的身份验证它:

[['username'], 'unique', 'targetAttribute' => 'username', 'targetClass' => '\common\models\User', 'message' => 'This username can not be taken.'],

它说这个用户名已被占用。所以我想检查一下我的价值username,认为它不是我的用户名。它就像 我目前在数据库中的用户名 - >短发 我在username字段中查看的价值 - >短发 我点击Submit,它应该检查此用户名是否唯一(显然是因为它是我的用户名)

就在那时,当我在数据库中的当前用户名 - >短发 并且在字段username中查看值 - >约翰 然后点击Submit - 应检查此用户名是否唯一

我知道"自定义验证器"所以我可以在InformationForm中使用自己的书面方法验证我的字段。我想找到如何做我在这里写的所有内容,除了在InformationForm中使用我自己的书面方法。

2 个答案:

答案 0 :(得分:2)

您可以将when属性用于unique验证程序。

你在模特中的规则是:

[
    ['username'], 'unique', 
    'targetAttribute' => 'username', 
    'targetClass' => '\common\models\User', 
    'message' => 'This username can not be taken.',
    'when' => function ($model) {
        return $model->username != Yii::$app->user->identity->getUsername(); // or other function for get current username
    }
],

您可以参考yii2文档:http://www.yiiframework.com/doc-2.0/yii-validators-validator.html#$when-detail

Goodluck,玩得开心!

答案 1 :(得分:0)

规则:

['email', 'unique', 'targetClass' => self::class, 'when' => [$this, 'whenSelfUnique']

处理方法时:

public function whenSelfUnique($model, $attribute) {
    /**
     * @var ActiveRecord $model
     */
    $condition = $model->getOldPrimaryKey(true);
    return !self::find()->where(array_merge($condition, [$attribute => $model->$attribute]))->exists();
}

public function whenSelfUnique($model, $attribute) {
    if (!\Yii::$app->user->isGuest) {
        return \Yii::$app->user->identity->$attribute !== $model->$attribute;
    }
    return true;
}

玩场景