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では)問題ない。