O Laravel possui conversão integrada para tipos date
e datetime
, mas se você quiser usar durações ISO 8061 com a classe DateInterval
nativa ou CarbonInterval
do Carbon, você está sem sorte.
Este pacote fornece duas conversões personalizadas (para DateInterval
e CarbonInterval
respectivamente) usando o recurso de conversões personalizadas do Laravel 7.x/8.x.
composer require atymic/laravel-dateinterval-cast
No $casts
do seu modelo, atribua a propriedade na qual deseja ativar a transmissão a qualquer uma das conversões fornecidas pelo pacote. Você deve usar um campo varchar
/ string
na tabela do seu banco de dados.
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,
];
}
A propriedade no modelo será então convertida em um objeto de intervalo e salva no banco de dados como uma string de duração ISO 8061. Se você tentar atribuir uma duração inválida (ou a tabela do banco de dados contiver uma e você usar um getter), uma exceção será lançada.
$ 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
}
Contribuições são bem-vindas :) Crie um PR e irei revisá-lo/mescrá-lo.
MIT