jlorente/laravel-eloquent-splitted-dates-trait

这是一个Laravel的Trait,用于Eloquent模型处理存储在日期字段本身以及独立的字段组件中的日期字段,如年、月、日、时间等...

1.0.5 2020-09-22 14:56 UTC

This package is auto-updated.

Last update: 2024-09-22 23:44:50 UTC


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。