我在我的模型中创建了一个beforeSave方法(扩展了GXActiveRecord),if isNewRecord永远不会被触发.我的beforeSave()被调用了.
当我打印$ this-> isNewRecord变量时,它是假的.该变量何时设置为false?我很确定这是新的
public function beforeSave(){
if(parent::beforeSave())
{
if($this->isNewRecord){
$this->setAttribute('doc_status','new');
print "something";
}else{
$this->setAttribute('doc_status','updated');
}
return true;
} else { return false;
}
Run Code Online (Sandbox Code Playgroud)
CActiveRecord-> isNewRecord如果您之前从未保存过,则为false.
例如
$model = new Product;
$model->name = uniqid("bar");
echo "isNewRecord?".$model->isNewRecord; // 1 (true)
$model->save();
echo "isNewRecord?".$model->isNewRecord; // (false)
$model = Product::model();
$model->name = uniqid("foo");
echo "isNewRecord?".$model->isNewRecord; // (false)
$model->save();
echo "isNewRecord?".$model->isNewRecord; // (false)
Run Code Online (Sandbox Code Playgroud)
小智 5
好吧,这可能为时已晚,无法回答,但我只是想把它弄出来,因为这已经造成了足够的混乱(至少对我而言)......
如果您调用parent::beforeSave()模型的beforeSave(),并isNewRecord在此之后进行测试,它将始终求值false,因为模型已保存.
您的模型建立在框架类之上,因此当您覆盖方法时,先执行任务,然后调用父方法.所以:
protected function beforeSave() {
if ($this->isNewRecord)
//do something
else
//do something else
/* some more code*/
parent::beforeSave();
return true;
}
Run Code Online (Sandbox Code Playgroud)
你也可以像这样调用parent beforeSave():
return parent::beforeSave();
Run Code Online (Sandbox Code Playgroud)
要么
return true && parent::beforeSave();
Run Code Online (Sandbox Code Playgroud)
希望这有助于其他通过谷歌找到这个问题的人.