2013-02-13 10 views
16

Ho una colonna della data che di solito assume valori come dd.MM.yyyy. La sua regola di convalida nel modello di rules() è questo:Come posso impostare una data su NULL in Yii?

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

sto popolamento del database da un file CSV, e mi piacerebbe essere in grado di impostare la data di NULL (cioè niente) se il record CSV è vuoto. Quindi, sto facendo:

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

Ma ho un errore che il formato della data non è valido. Perché?

Il CDateValidator documentation afferma che la proprietà allowEmpty è true per impostazione predefinita, quindi dovrebbe essere possibile impostarla su NULL, giusto? Si noti che se si assegna solo la stringa "" alla data, verrà convertito in un timestamp 0000-00-00 00:00:00, che non è NULL.

+3

https://github.com/yiisoft/yii/issues/2056 – dInGd0nG

+0

Non sono un esperto di Yii ma guardando i documenti si potrebbe forse aggirare usando questo metodo per verificare se il valore isnull()? http://www.yiiframework.com/doc/api/1.1/CValidator#except-detail – Jason

+0

@ dInGd0nG Interessante, questo spiega il fallimento, grazie. – slhck

risposta

24

nel modello rules():

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

anche,

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

dovrebbe fare anche il trucco.

+0

Questa regola è esattamente quello che sto cercando, poiché funziona anche quando la data viene rimossa manualmente dal frontend. – slhck

3

La correzione banale per questo non è per impostare il valore affatto durante realizzazione:

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

In questo modo, non viene impostato la data e quindi appaiono come vuoto, che passa anche la validazione.

2

L'assegnazione di un CDbExpression al campo non consentirà (e dovrebbe) di superare la convalida; il validatore consente null ma sicuramente non può consentire un arbitrario CDbExpression come valore del campo; Questo non dovrebbe essere una sorpresa.

Se si desidera scrivere null nel database, eseguire semplicemente $user->start = null - non vi è alcun motivo per coinvolgere lo CDbExpression qui.

Un altro approccio è possibile utilizzare nel caso in cui si fatto necessario utilizzare CDbExpression sarebbe a dire save non per convalidare il record e farlo manualmente, come in:

$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 
} 
Problemi correlati