jlorente/laravel-eloquent-splitted-dates-trait
这是一个Laravel的Trait,用于Eloquent模型处理存储在日期字段本身以及独立的字段组件中的日期字段,如年、月、日、时间等...
Requires
- php: >=7.0.0
- illuminate/support: >=5.5
Requires (Dev)
- phpunit/phpunit: ^7.5|^8.0
README
这是一个Laravel的Trait,用于Eloquent模型处理存储在日期字段本身以及独立的字段组件中的日期字段,如年、月、日、小时等...
安装
安装此扩展的首选方式是通过 composer。
安装Composer后,可以使用以下命令安装扩展
$ php composer.phar require jlorente/laravel-eloquent-splitted-dates-trait
或者添加
... "require": { "jlorente/laravel-eloquent-splitted-dates-trait": "*" }
到您的composer.json
文件的require
部分。
用法
基本配置
要在Eloquent模型中启用和配置分割日期字段,请在模型上使用Jlorente\Laravel\Eloquent\Concerns\SplittedDates\HasSplittedDates Trait,并定义要分割存储的日期字段splitDates数组。
<?php use Illuminate\Database\Eloquent\Model; use Jlorente\Laravel\Eloquent\Concerns\SplittedDates\HasSplittedDates; class Subscription extends Model { use HasSplittedDates; /** * The splitted dates attributes. * * @var array */ protected $splittedDates = [ 'begin_at' ]; }
在示例中,“begin_at”日期将在“begin_at_year”、“begin_at_month”和“begin_at_day”字段中分割存储。每当设置“begin_at”字段时,其他字段也会相应设置,反之亦然。
$subscription = new Subscription(); $subscription->begin_at = Carbon::create(2019, 10, 2); echo $subscription->begin_at_year; // 2019 echo $subscription->begin_at_month; // 10 echo $subscription->begin_at_day; // 2
如果分割组件之一为null,则对应的主要属性“begin_at”的对应组件将在月和日属性的情况下设置为1,在时间属性的情况下设置为0,在年属性的情况下设置为当前年份。
$subscription = new Subscription(); $subscription->begin_at_year = 2025 // 2025 echo $subscription->begin_at->toDateTimeString(); // 2025-01-01 00:00:00 $subscription->begin_at_day = 26 // 2025 echo $subscription->begin_at->toDateTimeString(); // 2025-01-26 00:00:00
splitDates数组中定义的所有属性都将被视为定义在日期转换器属性中,因此您可以将其值设置为UNIX时间戳、日期字符串(Y-m-d)、日期时间字符串或DateTime / Carbon实例。
$subscription = new Subscription(); $subscription->begin_at = Carbon::create(2019, 10, 2); // OK $subscription->begin_at = '2019-10-02' // OK $subscription->begin_at = '2019-10-02 22:11:45' // OK $subscription->begin_at = strtotime() // OK
请记住,数据库表必须具有相应的列"_year"、"_month"和"_day"来存储分割日期值。
高级配置
分割日期的默认配置是将日期值映射到年、月和日字段,但您可以将值映射到您想要的任何Carbon单位(年、月、日、小时、分钟、秒、毫秒、微秒)。
要使用除默认单位之外的其他单位配置分割日期,请定义您要在splitDates属性定义中存储的单位。
<?php use Illuminate\Database\Eloquent\Model; use Jlorente\Laravel\Eloquent\Concerns\SplittedDates\HasSplittedDates; class Subscription extends Model { use HasSplittedDates; /** * The splitted dates attributes. * * @var array */ protected $splittedDates = [ 'begin_at' => ['hour', 'minute'] ]; }
这样做,每当设置“begin_at”字段时,“begin_at_hour”和“begin_at_minute”属性将设置,反之亦然。
$subscription = new Subscription(); $subscription->begin_at = Carbon::create(2019, 10, 2, 15, 45, 12); echo $subscription->begin_at_hour; // 15 echo $subscription->begin_at_minute; // 45 $subscription->begin_at_minute = 31; echo $subscription->begin_at->toDateTimeString(); // 2019-10-02 15:31:12
其他注意事项
该Trait在设置分割字段时不会验证日期,因此如果为日期设置无效值,则可能发生日期溢出。
$subscription = new Subscription(); $subscription->begin_at = Carbon::create(2019, 10, 2, 15, 45, 12); $subscription->begin_at_hour = 27; // => Invalid value echo $subscription->begin_at_hour; // 27 echo $subscription->begin_at->toDateTimeString(); // 2019-10-03 03:45:12
许可协议
版权 © 2019 José Lorente Martín jose.lorente.martin@gmail.com.
在BSD 3-Clause License下许可。有关详细信息,请参阅LICENSE.txt。