如何在调用CActiveRecord中的save方法之前验证属性


How to validate the attributes before calling the method save in CActiveRecord?

假设我有一个模型项目,owner_id代表项目的所有者。在创建新项目时,用户需要键入所有者的名称而不是id。我编写了一个方法来验证,以确保用户确实存在于系统中,然后我可以获得用户的id。规则是:

 array('owner_name', 'userValidation')

但是我发现只有当下面的语句执行

时才会调用验证。
 $model->save()

这意味着如果我试图在保存之前使用语句

获取不在系统中的用户的id
 $model->validate();
 $user=User::model()->findByAttributes(array('username'=>$model->owner_name));
 $model->owner_id=$user->id;

将会有一个异常。所以我的问题是,当我调用validate()方法时,为什么验证不像预期的那样工作?我检查了方法保存在Yii

的源代码
 public function save($runValidation=true,$attributes=null)
    {
            if(!$runValidation || $this->validate($attributes))
                    return $this->getIsNewRecord() ? $this->insert($attributes) : $this->update($attributes);
            else
                    return false;
    }

我认为它也尝试通过调用validate()来验证

您没有检查validate()的返回值。试试这样做:

if ($model->validate()) {
    $user=User::model()->findByAttributes(array('username'=>$model->owner_name));
    $model->owner_id=$user->id;
    /// ...
} else {
    // handle the case that userValidation failed
}