Laravel tiene conversión incorporada para tipos date
y datetime
, pero si desea utilizar duraciones ISO 8061 con la clase nativa DateInterval
o CarbonInterval
de Carbon, no tiene suerte.
Este paquete proporciona dos conversiones personalizadas (para DateInterval
y CarbonInterval
respectivamente) utilizando la función de conversiones personalizadas de Laravel 7.x/8.x.
composer require atymic/laravel-dateinterval-cast
En $casts
de su modelo, asigne la propiedad que desea habilitar a cualquiera de las conversiones proporcionadas por el paquete. Debe utilizar un campo varchar
/ string
en la tabla de su base de datos.
class TestModel extends Model
{
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $ casts = [
' is_xyz ' => ' boolean ' ,
' date_interval ' => DateIntervalCast::class,
' carbon_interval ' => CarbonIntervalCast::class,
];
}
Luego, la propiedad del modelo se convertirá en un objeto de intervalo y se guardará en la base de datos como una cadena de duración ISO 8061. Si intenta asignar una duración no válida (o la tabla de la base de datos contiene una y utiliza un captador), se genera una excepción.
$ model = new TestModel ();
$ model -> carbon_interval = now ()-> subHours ( 3 )-> diffAsCarbonInterval ();
$ model -> save (); // Saved as `P3H`
$ model -> fresh ();
$ model -> carbon_interval ; // Instance of `CarbonInterval`
$ model -> carbon_interval -> forHumans (); // prints '3 hours ago'
try {
$ model -> carbon_interval = ' not_a_iso_period ' ;
} catch ( Atymic DateIntervalCast Exception InvalidIsoDuration $ e ) {
// Exception thrown if you try to assign an invalid duration
}
Se aceptan contribuciones :) Cree un PR y lo revisaré/fusionaré.
MIT