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