当我们使用软删除行为时,如何实现唯一验证


How to implement unique validation when we use soft delete behavior?

Yii中,当我们使用soft delete行为时,如何实现unique验证的最佳方法?

目前我在模型中使用自定义方法,也许有另一个简单的解决方案存在?下面的代码仍然不完整,更新时仍然应用验证。

public function checkexists($attribute,$param) {
        if(!$this->hasErrors())  // we only want to authenticate when no input errors
        {
            $username = $this->username;
            if($username)
            {
                $Command = Yii::app()->db->createCommand('SELECT * FROM users WHERE username = :username AND status = true');
                $Command->bindParam(":username", $username);
                $user = $Command->queryAll();
                if (!empty($user))
                {
                    $this->id_user=isset($user[0]['id_user'])?$user[0]['id_user']:'';
                    $this->addError('username', 'Username exist');
                }
            }   
        }
    }

您可以为此使用惟一验证器。无需编写额外的验证函数

使用criteria作为附加查询条件。

public function rules()
{
    $criteria = new CDbCriteria();
    $criteria->compare('status', 'true');
    return array(
        array('username', 'unique', 'criteria'=> $criteria)
    );
}

您将不得不修复当前使用的自定义验证器。您还必须从检查中排除当前用户。

$Command = Yii::app()->db->createCommand('SELECT * FROM users WHERE username = :username AND status = true AND id_user <> :id_user');
$Command->bindParam(":username", $username);
$Command->bindParam(":id_user", $this->id_user);
$user = $Command->queryAll();