关联Active Record的更新问题

以“The Yii Blog Tutorial”为例子,数据表作了更改,见附图。

按照这里的方法http://www.yiiframework.com/doc/blog/post.create

例子中在afterSave()方法里更新Tag表,用$this->tags来获取表单提交上来的tags的值,

但是现在我想在afterSave()方法里更新post_detail表里的title和content,但是post模型并没有content这个属性,所以用$this->content并不能获取到表单提交上来的content的值,我怎样才能获取表单提交上来的content的值呢?

另外,post模型里没有content这个属性,我怎样才能在post模型里设置rules来验证content呢?

参见:http://www.yiiframework.com/doc/cookbook/19/

Quote

参见:http://www.yiiframework.com/doc/cookbook/19/

这个我已经看过了,我觉得用这种方法的话,控制器里的代码比较多,所以我想把更新关联表的功能放在model里实现,就像“The Yii Blog Tutorial”那样

你可以声明一个content成员,并且在safeAttributes()包括它。然后在rules()添加对content的验证。

Quote

<?php

class Post extends CActiveRecord

{

//修改之一:这里增加content属性





public $content;





public static function model($className=__CLASS__)





{





	return parent::model($className);





}











public function rules()





{





	return array(





		......





		array(&#039;content&#039;,&#039;required&#039;), //修改之二:增加content验证





		......





	);





}











public function relations()





{





	return array(





		&#039;Post_detail&#039;=&gt;array(self::HAS_ONE, &#039;Post_detail&#039;, &#039;id&#039;),





	);





}











//修改之三:重写safeAttributes,增加content属性





public function safeAttributes()





{





	$attributes=array();





	foreach($this-&gt;getMetaData()-&gt;columns as $name=&gt;$column)





	{





		if(!$column-&gt;isPrimaryKey)





			$attributes&#91;]=$name;





	}





	//增加content属性





	$attributes&#91;]=&#039;content&#039;;





	return ;





}











public function afterSave()





{





	//现在在这里可以用$this-&gt;content来获取表单提交的content的值了,然后可以进行插入post_detail等操作





}

}

?>

我的模型改成这样之后可以了,但不知这种方法是否正确

模型里一共修改了三个地方,不知有没有更简便的方法?

safeAttribute可以更简单点:



<?php


$attributes=parent::safeAttributes();


$attributes[]='content';


return $attributes;


Quote

safeAttribute可以更简单点:


<?php


$attributes=parent::safeAttributes();


$attributes[]='content';


return $attributes;


多谢解答

Quote

你可以声明一个content成员,并且在safeAttributes()包括它。然后在rules()添加对content的验证。

有新问题

这样定义了模型之后,在控制器用以下代码更新数据库:

$article=Article::model()->findbyPk(1);


$article->title='xxxx';


$article->save();

这样会出错,保存不了,因为这时content成员还没有赋值,所以rules()验证不能通过,怎么办呢?

1 剔除不通过规则

2 update()方法更新

3 把没通过的规则搞定,继续save()