urlmanager una poner imagen example ejemplos como php mysql validation datetime yii

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.