sebastiaanluca/laravel-boolean-dates

自动将 Eloquent 模型布尔属性转换为日期(反之亦然)。

8.0.0 2024-02-25 00:38 UTC

This package is auto-updated.

Last update: 2024-09-25 01:48:49 UTC


README

Latest stable release Software license Build status Total downloads Total stars

Read my blog View my other packages and projects Follow @sebastiaanluca on Twitter Share this package on Twitter

自动将 Eloquent 模型布尔字段转换为日期(反之亦然),以便您始终知道某事何时被接受或更改。

假设您有一个用户注册页面,用户需要接受您的条款,并且可以使用复选框选择某些功能。根据新的(类似的)GDPR隐私法律,您不仅要记录他们是否接受了这些条款(或没有接受),还要记录他们何时接受。

示例

用户注册控制器

$input = request()->input();

$user = User::create([
    'has_accepted_terms' => $input['terms'],
    'is_subscribed_to_newsletter' => $input['newsletter'],
]);

代码中的其他任何地方

// true or false (boolean)
$user->has_accepted_terms;

// 2018-05-10 16:24:22 (Carbon instance)
$user->accepted_terms_at;

目录

需求

  • PHP 8.1 或 8.2
  • Laravel 10

如何安装

使用 composer 将包添加到您的项目中

composer require sebastiaanluca/laravel-boolean-dates

通过以下方式设置您的 Eloquent 模型

  1. 将您的日期时间列添加到 $casts 属性或 casts() 方法
  2. 将布尔属性添加到 $appends
  3. 为每个字段创建属性访问器和修改器
<?php

declare(strict_types=1);

use Illuminate\Database\Eloquent\Model;
use SebastiaanLuca\BooleanDates\BooleanDateAttribute;

class User extends Model
{
    /**
     * The attributes that should be cast to native types.
     *
     * @var array<string, string>
     */
    protected $casts = [
        'accepted_terms_at' => 'immutable_datetime',
        'subscribed_to_newsletter_at' => 'datetime',
    ];

    /**
     * The accessors to append to the model's array form.
     *
     * @var array<int, string>
     */
    protected $appends = [
        'has_accepted_terms',
        'is_subscribed_to_newsletter',
    ];

    protected function hasAcceptedTerms(): Attribute
    {
        return BooleanDateAttribute::for('accepted_terms_at');
    }

    protected function isSubscribedToNewsletter(): Attribute
    {
        return BooleanDateAttribute::for('subscribed_to_newsletter_at');
    }
}

如果您的数据库表还没有日期时间列,可以创建一个 迁移 来创建一个新表或修改现有的表以添加时间戳字段

<?php

declare(strict_types=1);

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration {
    public function up(): void
    {
        Schema::table('users', static function (Blueprint $table): void {
            $table->timestamp('accepted_terms_at')->nullable();
            $table->timestamp('subscribed_to_newsletter_at')->nullable();
        });
    }
};

如何使用

保存日期

如果布尔日期字段的值为 true-like,它将被自动转换为当前日期时间。您可以使用任何像布尔值、字符串、正整数等。

$user = new User;

// Setting values explicitly
$user->has_accepted_terms = true;
$user->has_accepted_terms = 'yes';
$user->has_accepted_terms = '1';
$user->has_accepted_terms = 1;

// Or using attribute filling
$user->fill(['is_subscribed_to_newsletter' => 'yes']);

$user->save();

所有字段现在都应包含类似于 2018-05-10 16:24:22 的日期时间。

请注意,存储在数据库列中的日期是不可变的,即它只设置一次。任何后续的更新都不会更改存储的日期(时间),除非您手动更新日期时间列,或将它设置为 false 再设置为 true(禁用然后启用它)。

例如

$user = new User;

$user->has_accepted_terms = true;
$user->save();

// `accepted_terms_at` column will contain `2022-03-13 13:20:00`

$user->has_accepted_terms = true;
$user->save();

// `accepted_terms_at` column will still contain the original `2022-03-13 13:20:00` date

清除保存的值

当然,您也可以删除保存的日期和时间,例如,如果用户撤回他们的批准

$user = User::findOrFail(42);

$user->has_accepted_terms = false;
$user->has_accepted_terms = null;
$user->has_accepted_terms = '0';
$user->has_accepted_terms = 0;
$user->has_accepted_terms = '';
// $user->has_accepted_terms = null;

$user->save();

False 或 false-like 值转换为 NULL

检索值

以布尔值检索字段

使用布尔字段的定义 来访问其布尔值

$user = User::findOrFail(42);

// true or false (boolean)
$user->has_accepted_terms;

以日期时间检索字段

使用布尔字段的定义 来显式访问其(Carbon)日期时间值

$user = User::findOrFail(42);

// 2018-05-10 16:24:22 (Carbon or CarbonImmutable instance)
$user->accepted_terms_at;

// null
$user->is_subscribed_to_newsletter;

数组转换

当将模型转换为数组时,如果已将布尔字段添加到模型中的 $appends 数组,则布尔字段将被包含在内。

$user = User::findOrFail(42);

$user->toArray();

/*
 * Which will return something like:
 * 
 * [
 *     'accepted_terms_at' => \Carbon\CarbonImmutable('2018-05-10 16:24:22'),
 *     'subscribed_to_newsletter_at' => \Illuminate\Support\Carbon('2018-05-10 16:24:22'),
 *     'has_accepted_terms' => true,
 *     'is_subscribed_to_newsletter' => true,
 * ];
 */

许可证

此包在 MIT 许可证(MIT)下运行。有关更多信息,请参阅 LICENSE

变更日志

请参阅 CHANGELOG 以了解最近发生了哪些变化。

测试

composer install
composer test

贡献

请参阅 CONTRIBUTINGCONDUCT 以获取详细信息。

安全

如果您发现任何与安全相关的问题,请通过电子邮件发送至 hello@sebastiaanluca.com,而不是使用问题追踪器。

致谢

关于

我的名字是Sebastiaan,我是一名自由职业后端开发者,专注于构建定制的Laravel应用程序。查看我的作品集以获取更多信息,查看我的博客以获取最新的技巧和窍门,以及我的其他软件包以启动您的下一个项目。

您有一个可能需要指导的项目吗?请通过电子邮件发送至 hello@sebastiaanluca.com