<?php namespace App\Casts; use Carbon\CarbonInterval; use Illuminate\Contracts\Database\Eloquent\CastsAttributes; class DateInterval implements CastsAttributes { /** * Cast the given value. * * @param \Illuminate\Database\Eloquent\Model $model * @param string $key * @param float $value * @param array $attributes * @return mixed */ public function get($model, $key, $value, $attributes) { if (!is_numeric($value)) { throw new \InvalidArgumentException('Value must be numeric'); } // by default the first argument to CarbonInterval sets the year to 1 hence adding null return (new CarbonInterval(null))->add('days', $value); } /** * Prepare the given value for storage. * * @param \Illuminate\Database\Eloquent\Model $model * @param string $key * @param float $value * @param array $attributes * @return mixed */ public function set($model, $key, $value, $attributes) { if (! $value instanceof \DateInterval) { throw new \InvalidArgumentException('Value must be an instance of ' . \DateInterval::class); } return CarbonInterval::instance($value)->total('days'); } }