php - parse - Laravel Carbon Data missing
laravel seed invalidargumentexception data missing (4)
Necesita establecer protected $dateFormat
en ''Ymd H:i
'' en su modelo, consulte https://laravel.com/docs/5.2/eloquent-mutators#date-mutators
En mi modelo tengo lo siguiente:
protected $dates = [
''start'',
''end'',
''created_at'',
''updated_at''
];
Estoy usando un selector de fecha y hora para insertar las fechas de inicio y finalización, en este formato:
2016-01-23 22:00
Sin los segundos. Cuando lo hago así, obtengo este error:
InvalidArgumentException in Carbon.php line 425:
Data missing
at Carbon::createFromFormat(''Y-m-d H:i:s'', ''2016-01-23 22:00'') in Model.php line 3015
Si incluyo los segundos, funciona. Los segundos no son importantes para mí, y no quiero incluirlos en mis campos de selector de fecha y hora. De todos modos, ¿todavía puedo usar esos campos como campos de fecha?
Puede establecer $ dateFormat en su modelo como dice Christian, pero si no desea implicar los campos updated_at y created_at en la operación, puede usar los eventos para "corregir" el objeto datetime antes de guardarlo en la base de datos.
Aquí tiene el documento oficial al respecto: https://laravel.com/docs/5.2/eloquent#events
Modelos
Esta función está desactivada, las emulaciones de carbono en Datetimes https://laravel.com/docs/5.0/eloquent#date-mutators
public function getDates()
{
return [];
}
tl; dr
La cadena de fecha y el formato de fecha son diferentes, debe cambiar la cadena de formato o modificar la cadena de fecha para que coincidan.
Explicación
El problema
Este error surge cuando la función createFromFormat de Carbon recibe una cadena de fecha que no coincide con la cadena de formato pasada. Más precisamente, esto proviene de la función DateTime::createFromFormat
, porque Carbon simplemente llama a eso:
public static function createFromFormat($format, $time, $tz = null)
{
if ($tz !== null) {
$dt = parent::createFromFormat($format, $time, static::safeCreateDateTimeZone($tz));
} else {
$dt = parent::createFromFormat($format, $time); // Where the error happens.
}
if ($dt instanceof DateTime) {
return static::instance($dt);
}
$errors = static::getLastErrors();
throw new InvalidArgumentException(implode(PHP_EOL, $errors[''errors''])); // Where the exception was thrown.
}
No hay suficientes datos
Si su cadena de fecha es "más corta" que la cadena de formato como en este caso:
Carbon::createFromFormat(''Y-m-d H:i:s'', ''2017-01-04 00:52'');
Carbono arrojará:
InvalidArgumentException en Carbon.php línea 425:
Datos faltantes
Demasiada información
Si su cadena de fecha es "más larga" que la cadena de formato como en este caso:
Carbon::createFromFormat(''Y-m-d H:i'', ''2017-01-02 00:27:00'');
Carbono arrojará:
InvalidArgumentException en Carbon.php línea 425:
Datos finales
Bajo el capó
De acuerdo con la documentación sobre mutadores, el formato de fecha predeterminado es: ''Ymd H:i:s''
. El procesamiento de la fecha ocurre en la función asDateTime
del Modelo . En la última condición se getDateFormat
función getDateFormat
, de ahí viene el formato personalizado. El formato predeterminado se define en la clase de Grammar
la base de datos .
Solución
Debe asegurarse de que la cadena de fecha coincida con la cadena de formato.
Cambiar la cadena de formato
Puede anular la cadena de formato predeterminada de esta manera:
class Event extends Model {
protected $dateFormat = ''Y-m-d H:i'';
}
Hay dos problemas con este enfoque:
- Esto se aplicará a todos los campos definidos en la matriz
$dates
del modelo. - Tienes que almacenar los datos en este formato en la base de datos.
Edite y formatee las cadenas de fecha
Mi solución recomendada es que el formato de fecha sea el predeterminado ''Ymd H:i:s''
y debe completar las partes faltantes de la fecha, como esta:
public function store(Request $request) {
$requestData = $request->all();
$requestData[''start_time''] .= '':00'';
$requestData[''end_time''] .= '':00'';
$event = new Event($requestData);
$event->save();
}
Y cuando quiera usar la fecha, debe formatearla:
public function show(Request request, $eventId) {
$event = Event::findOrFail($eventId);
$startTime = $event->start_time->format(''Y-m-d H:i'');
$endTime = $event->end_time->format(''Y-m-d H:i'');
}
Por supuesto, los campos deben ser mutados a fechas:
class Event extends Model {
protected $dates = [
''start_time'',
''end_time'',
''created_at'',
''updated_at'',
''deleted_at'',
];
}