Yii2 忽略对软删除模型的验证

Yii2 忽略对软删除模型的验证,yii2,Yii2,我有user表。我创建了一个包含3个字段的表单: 用户名 电话号码 地位 前两个字段是唯一的。这些字段的模型规则如下所示: [['Username', 'phonenumber'], 'required'], [['Username', 'phonenumber'], 'unique'], 我使用软删除,所以当记录被删除时,它实际上保留在数据库中,但状态值将更改为0 问题是,如果我使用现有用户名添加记录,它会显示一条错误消息,如“已添加”。如果用户名的状态值为0我需要忽略验证,请使用Uni

我有
user
表。我创建了一个包含3个字段的表单:

  • 用户名
  • 电话号码
  • 地位
前两个字段是唯一的。这些字段的模型规则如下所示:

[['Username', 'phonenumber'], 'required'],
[['Username', 'phonenumber'], 'unique'],
我使用软删除,所以当记录被删除时,它实际上保留在数据库中,但状态值将更改为
0


问题是,如果我使用现有用户名添加记录,它会显示一条错误消息,如“已添加”。如果
用户名
的状态值为
0

我需要忽略验证,请使用
UniqueValidator的
过滤器
属性

public function rules()
{
    return [
        ...

        ['username', 'unique', 'filter' => ['<>', 'status', 0]];

        ...
    ];
}
公共功能规则()
{
返回[
...
['username','unique','filter'=>[''status',0]];
...
];
}
最好声明常量,而不是
0
(类似于
const STATUS\u DELETED=0
),并将其作为
self::STATUS\u DELETED
user
类中使用。您也可以使用
=而不是


最后一个建议是使用
username
而不是
username
来遵循命名数据库表列的约定

阅读更多有关中声明
过滤器的方法的信息


过滤器设置为数组的方法如下所述。

您可以使用自己的函数来确定给定用户名是否已处于活动状态。在唯一验证规则的“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],
}

wat是在筛选器数组中的使用,它表示
不等于
。感谢您的评论,在回答中提供了有关在
筛选器
中指定数组的信息。“最后一个建议是使用用户名”-您是指“用户名”吗?是的,但是当专门属性正好存在时,它就没有意义了。另外,您的代码是针对Yii1的。是的,您是对的“过滤器”提供了确切的功能,因此无需生成函数。Thnks