YiiのbeforeSave()の実行タイミング
beforeSave()は、validateがtrueとなったあとに実行される。
例えば、登録日や更新日をCTimestampBehaviorを使って自動的に登録したい、
Fooクラスを定義したとする。
class Foo extends CActiveRecord
{
…
public function rules()
{
return array(
…
array('create_time, update_time', 'required')
...
);
}
public function behaviors()
{
// CTimestampBehaviorの定義
….
}
}
このとき、以下のようにしても保存されない。
$foo = new Foo;
… // create_time, update_time以外のカラムの設定
$foo->save(); // false
どうやら、create_time, update_timeが設定されていないので、
ruleによってvalidateがfalseになり、behaviorは実行されないみたい。
で、解決方法。
1つはrulesからcreate_time, update_timeを取り除く。
rules()にルールがないので、validateは問題なく通るし、
attributesを使っても、create_time, update_timeは登録されない。
他の方法として、afterConstruct()を以下のように実装する。
protected function afterConstruct()
{
$this->create_time = time();
$this->update_time= time();
}
CTimestampBehaviorでは、強制的にcreate_time, update_timeを更新するので
先に登録指定おいても(1.1.8では)問題ない。