2014-04-04 81 views
0

在我的模型中,我有一個名爲timestamp(MySQL類型:timestamp)的字段,在safe驗證器中定義,我無法手動編寫它。每次我打電話:時間戳字段只能通過Yii中的行爲更新

$model->timestmap = time(); 
$model->save(); 

模型保存(行創建/更新),那就是 - 它通過驗證沒有錯誤,但timestamp場充滿了0000-00-00 00:00:00默認值(我決定刪除默認on update CURRENT_TIMESTAMP屬性,我不希望MySQL來處理這個)。

但是,當我刪除上面的代碼並附加CTimestampBehavior而不是,更新和創建字段正在填充正確的值,沒有任何問題。

可能發生什麼或我錯過了什麼?行爲如何在沒有問題的情況下更新字段,而我的手動嘗試失敗?這是因爲列類型是timestamp,而不是datetimeint

我總是被告知,第一條線索,爲什麼某些屬性沒有保存,是因爲它沒有在safe驗證程序列表中列出,或者因爲它在unsafe驗證程序列表中列出。但是這個列表在safe列表中。

+0

謝謝大家給予啓發答案和可惜,我只能接受其中的一個。在我的例子中,我決定繼續使用'CTimestampBehavior'作爲最簡單的解決方案。 – trejder

回答

4

您的數據庫字段是datetime字段(我假設,查看您的默認值),但填寫的內容爲unix timestamp。與CDbExpression,而不是嘗試:

$model->timestamp = new CDbExpression('NOW()'); 
$model->save(); 
+0

我總是使用CDbExpression。對於CDateTimeParser,+1 –

2

我通常使用$model->timestamp = date('Y-m-d H:i:s'),它完美

1

至於其他的答案已經建議:

時間戳需要轉換到MySQL兼容的日期格式字符串以某種方式在加載時以其他方式保存。現在你已經發現CTimestampBehavior爲你做了這件事,但不幸的是它並不關心加載。 IMO最適合您的解決方案是沿着道路東西:

public function beforeSave() 
{ 
    $this->timestamp = date('Y-m-d H:i:s', $this->timestamp); 
    return parent::beforeSave(); 
} 

public function afterSave() 
{ 
    // Turn it back into a unix timestamp in case you want to continue working with the record 
    $this->timestamp = CDateTimeParser::parse($this->timestamp, 'yyyy-MM-dd hh:mm:ss'); 
    parent::afterSave(); 
} 

public function afterFind() 
{ 
    $this->timestamp = CDateTimeParser::parse($this->timestamp, 'yyyy-MM-dd hh:mm:ss'); 
    return parent::afterFind(); 
} 

這是一個愚蠢的時間戳的大量的工作,所以我自己我有我鏈接到我的模型自動類型轉換的行爲。此行爲使用表元數據自動處理所有內容。在這方面投資可能是一個好主意。我想過讓我的開源,但它有點混亂atm;)

但上面的代碼會給你unix時間與執行期間一起工作,同時保存它將暫時轉換爲一個MySQL日期時間字符串

希望有幫助。

+0

+1。 Yii有沒有上課? :] – trejder

+0

我已經使用了近5年的框架,每隔幾天我仍然會發現新東西;) – Blizz

相關問題