laravel dateinterval cast
vel 8.x Support
Laravel 具有内置的date
和datetime
类型转换,但如果您想将 ISO 8061 持续时间与本机DateInterval
类或 Carbon 的CarbonInterval
一起使用,那么您就不走运了。
该包使用 Laravel 7.x/8.x 的自定义转换功能提供了两个自定义转换(分别针对DateInterval
和CarbonInterval
)。
composer require atymic/laravel-dateinterval-cast
在模型的$casts
中,将您希望启用强制转换的属性分配给包提供的任一强制转换。您应该在数据库表中使用varchar
/ string
字段。
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,
];
}
然后,模型上的属性将被转换为间隔对象,并作为 ISO 8061 持续时间字符串保存到数据库中。如果您尝试分配无效的持续时间(或者数据库表包含一个持续时间,并且您使用 getter),则会引发异常。
$ 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
}
欢迎贡献:) 请创建一个 PR,我将审查/合并它。
麻省理工学院