php - poner - ¿Cómo puedo establecer una fecha en NULL en Yii?
yii2 date format (3)
Tengo una columna de fecha que generalmente toma valores como dd.MM.yyyy
. Su regla de validación en las rules()
del modelo rules()
es esta:
array(''start, end'', ''date'', ''format'' => ''dd.MM.yyyy''),
Estoy poblando la base de datos de un archivo CSV, y me gustaría poder establecer la fecha en NULL
(es decir, nada) si el registro CSV está vacío. Entonces, estoy haciendo:
if (empty($csv_data)) {
$user->start = new CDbExpression(''NULL'');
} else {
$user->start = $csv_data;
}
Pero me aparece un error que indica que el formato de fecha no es válido. ¿Porqué es eso?
La documentación de CDateValidator
dice que la propiedad allowEmpty
es verdadera por defecto, por lo que debería poder establecer esto en NULL
, ¿verdad? Tenga en cuenta que si solo asigno la cadena ""
a la fecha, la convertirá a una marca de tiempo 0000-00-00 00:00:00
, que no es NULL
.
Asignar un CDbExpression
al campo (y nunca) pasará la validación; el validador permite null
pero definitivamente no puede permitir un CDbExpression
arbitrario como el valor del campo; Esto no debería ser sorprendente.
Si quería escribir null
en la base de datos, hágalo simplemente con $user->start = null
; no hay ninguna razón para involucrar a CDbExpression
aquí.
Otro enfoque que podría usar en caso de que necesite usar CDbExpression
sería decirle a save
no valide el registro y hacerlo manualmente, como en:
$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
}
La solución trivial para esto no es establecer el valor en absoluto durante la creación:
if (!empty($csv_data)) {
$user->start = $csv_data;
}
De esta forma, la fecha no se establecerá y aparecerá como vacía, que también pasa la validación.
en rules()
modelo rules()
:
array(''start, end'', ''date'', ''format'' => ''dd.MM.yyyy''),
array(''start, end'', ''default'', ''setOnEmpty'' => true, ''value'' => null),
además,
if (empty($csv_data)) {
$user->start = null;
} ...
debería hacer el truco también.