2017-09-05 72 views
-2

的工作,我有下面的類與TimestampBehaviourTimestampBehavior不會因爲驗證失敗

/** 
* @property int $id 
* @property string $name 
* @property int $created_at 
*/ 
class Workspace extends yii\db\ActiveRecord { 

    public static function tableName() { 
     return 'workspace'; 
    } 

    public function behaviors() { 
     return [ 
      [ 
       'class'  => TimestampBehavior::className(), 
       'attributes' => [ 
        ActiveRecord::EVENT_BEFORE_INSERT => 'created_at', 
        ActiveRecord::EVENT_BEFORE_UPDATE => false, 
       ], 
       'value' => date('Y-m-d H:i:s') 
      ], 
     ]; 
    } 
    ... 
} 

出於某種原因,該行爲不填充屬性。當我試圖保存模型時,它總是空的($workspace->save())。自驗證失敗後,我無法保存它(「created_at不能爲空」)。這個班沒有什麼特別的。什麼都沒有被覆蓋。可能是什麼問題呢?

回答

0

原來,驗證規則造成了麻煩。意想不到的,因爲我認爲一切都是正確的。這些是我的規則:

public function rules() { 
    return [ 
     [['id', 'name', 'created_at'], 'required'], 
     [['id'], 'int'], 
     [['name'], 'string', 'max' => 100], 
     [['created_at' ], 'datetime'], 
    ]; 
} 

created_at切不可要求 - 這就是問題所在。

它甚至documented

由於屬性值將被通過這種行爲自動設置, 它們通常不是用戶輸入,並且因此不應被驗證, 即created_at和的updated_at不應該出現在規則()方法 的模型。

$workspace->save()被執行時,第一步是驗證。只有在該步驟之後,EVENT_BEFORE_INSERT/EVENT_BEFORE_UPDATE纔會被觸發,這會導致TimestampBehaviour填充指定的字段。只有驗證成功時纔會發生這種情況! (如果你var_dump,你確實會看到一個空的created_at。)太遲了,驗證已經發生了,並且我有驗證錯誤。

推薦的解決方案是從需要的規則中刪除created_at。當然,其他方法也是可能的(例如,關閉驗證或傳遞save()被調用時應驗證的屬性)。

0

添加行爲像波紋管

public function behaviors() 
{ 
    return [ 
     [ 
      'class' => TimestampBehavior::className(), 
      'createdAtAttribute' => 'create_time', 
      'updatedAtAttribute' => 'update_time', 
      'value' => new Expression('NOW()'), 
     ], 
    ]; 
} 

,並在模型類添加到安全記錄。

public function rules() 
{ 
    return array(
     array('create_time,update_time', 'safe'), 
    ); 
}