如何在调用方法之前验证属性保存在CActiveRecord中?

时间:2011-12-17 11:55:42

标签: php yii

假设我有一个模型项目,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()验证。

1 个答案:

答案 0 :(得分:2)

您没有检查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
}