2013-02-13 59 views
16

我有一個日期列,通常取值爲dd.MM.yyyy。在模型的rules()它的驗證規則是這樣的:如何在Yii中將日期設置爲NULL?

array('start, end', 'date', 'format' => 'dd.MM.yyyy'), 

我從一個CSV文件填充數據庫,我希望能夠將日期設置爲NULL(即沒有),如果CSV記錄是空的。所以,我在做:

if (empty($csv_data)) { 
    $user->start = new CDbExpression('NULL'); 
} else { 
    $user->start = $csv_data; 
} 

但我得到一個錯誤,日期格式無效。這是爲什麼?

CDateValidator documentation表示allowEmpty屬性默認爲true,所以它應該能夠將其設置爲NULL,對吧?請注意,如果我只是將""字符串分配給日期,則會將其轉換爲0000-00-00 00:00:00時間戳,而不是NULL

+3

https://github.com/yiisoft/yii/issues/2056 – dInGd0nG 2013-02-13 09:25:54

+0

我不是Yii的專家,但看着文檔你可能可以解決它使用這種方法來檢查值是否爲空()? http://www.yiiframework.com/doc/api/1.1/CValidator#except-detail – Jason 2013-02-13 09:28:33

+0

@ dInGd0nG有趣的是,這解釋了失敗,謝謝。 – slhck 2013-02-13 09:29:07

回答

24

array('start, end', 'date', 'format' => 'dd.MM.yyyy'), 
array('start, end', 'default', 'setOnEmpty' => true, 'value' => null), 

if (empty($csv_data)) { 
    $user->start = null; 
} ... 

也應該這樣做。

+0

該規則正是我所追求的,因爲它也適用於從前端手動刪除日期的情況。 – slhck 2013-02-13 11:27:47

3

這種情況的瑣碎的解決方法是不創建過程中在所有設置的值

if (!empty($csv_data)) { 
    $user->start = $csv_data; 
} 

這樣,日期將不會被設置,因此顯示爲空的,這也通過了驗證。

2

CDbExpression分配給該字段將(而且應該)永遠不會通過驗證;驗證器允許null,但它絕對不能允許任意CDbExpression作爲該字段的值;這應該不會令人驚訝。

如果您想將null寫入數據庫,那麼只需使用$user->start = null即可 - 在此處沒有任何理由涉及CDbExpression

另一種方法,你可以的情況下,使用您沒有需要使用CDbExpression會告訴save不驗證記錄,並做手工,如:模型rules()

$attributes = $user->attributeNames(); 
if (empty($csv_data)) { 
    $user->start = new CDbExpression('NULL'); 
    $attributes = array_diff($attributes, array('start')); // don't validate this 
} else { 
    $user->start = $csv_data; 
} 

if ($user->validate($attributes)) { // validate only attributes we want here 
    $user->save(false); // no validation at all here 
} 
相關問題