在视图中,我的字段username
始终由当前用户的用户名填充。并且它总是(在提交时)将用户名值发送到我的InformationForm
并在下一个唯一的身份验证它:
[['username'], 'unique', 'targetAttribute' => 'username', 'targetClass' => '\common\models\User', 'message' => 'This username can not be taken.'],
它说这个用户名已被占用。所以我想检查一下我的价值username
,认为它不是我的用户名。它就像
我目前在数据库中的用户名 - >短发
我在username
字段中查看的价值 - >短发
我点击Submit
,它应该检查此用户名是否唯一(显然是因为它是我的用户名)
就在那时,当我在数据库中的当前用户名 - >短发
并且在字段username
中查看值 - >约翰
然后点击Submit
- 应检查此用户名是否唯一
我知道"自定义验证器"所以我可以在InformationForm
中使用自己的书面方法验证我的字段。我想找到如何做我在这里写的所有内容,除了在InformationForm
中使用我自己的书面方法。
答案 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;
}
玩场景