作業ノート

様々なまとめ、雑感など

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