在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();