В Laravel есть встроенное приведение типов date
и datetime
, но если вы хотите использовать длительность ISO 8061 с собственным классом DateInterval
или CarbonInterval
от Carbon, вам не повезло.
Этот пакет предоставляет два пользовательских приведения (для DateInterval
и CarbonInterval
соответственно) с использованием функции пользовательских приведения Laravel 7.x/8.x.
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. Если вы попытаетесь назначить недопустимую продолжительность (или таблица базы данных содержит ее, и вы используете метод получения), выдается исключение.
$ 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, и я рассмотрю/объединю его.
Массачусетский технологический институт