我有user
表。我创建了一个包含3个字段的表单:
前两个字段是唯一的。这些字段的模型规则如下所示:
[['Username', 'phonenumber'], 'required'],
[['Username', 'phonenumber'], 'unique'],
我使用软删除,因此当删除记录时,它实际上会保留在数据库中,但状态值将更改为0
。
问题是,如果我添加一个包含现有用户名的记录,它会显示一条错误消息,例如“已添加”。如果username
的状态值为0
,我需要忽略验证。
答案 0 :(得分:4)
使用filter
UniqueValidator
属性
public function rules()
{
return [
...
['username', 'unique', 'filter' => ['<>', 'status', 0]];
...
];
}
最好在0
类中声明常量而不是const STATUS_DELETED = 0
(类似self::STATUS_DELETED
)并将其用作User
。您也可以使用!=
代替<>
。
最后一条建议是使用username
代替Username
来遵循命名数据库表列的惯例。
详细了解official docs中声明filter
的方法。
将filter
条件设置为数组的方式为here。
答案 1 :(得分:-1)
您可以使用自己的函数来确定已存在的用户名是否处于活动状态。在唯一验证规则的“when”属性中使用此函数。
看看:
public function rules()
{
$check = function($model) {
$existActiveUser = User::model()->findByAttributes(array("username"=>$model->username,"status"=>1));
if($existActiveUser)
return true;
else
return false;
};
return [
['Username', 'phonenumber'], 'required'],
[['Username','phonenumber'],'unique','when'=>$check],
}