sebastiaanluca / laravel-boolean-dates
自动将 Eloquent 模型布尔属性转换为日期(反之亦然)。
Requires
- php: ~8.2|~8.3
- illuminate/database: ^10.0|^11.0
- illuminate/support: ^10.0|^11.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.50
- laravel/pint: ^1.14
- phpunit/phpunit: ^11.0.3
- rector/rector: ^1.0.1
- roave/security-advisories: dev-latest
README
自动将 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 模型
- 将您的日期时间列添加到
$casts
属性或casts()
方法 - 将布尔属性添加到
$appends
- 为每个字段创建属性访问器和修改器
<?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
贡献
请参阅 CONTRIBUTING 和 CONDUCT 以获取详细信息。
安全
如果您发现任何与安全相关的问题,请通过电子邮件发送至 hello@sebastiaanluca.com,而不是使用问题追踪器。
致谢
关于
我的名字是Sebastiaan,我是一名自由职业后端开发者,专注于构建定制的Laravel应用程序。查看我的作品集以获取更多信息,查看我的博客以获取最新的技巧和窍门,以及我的其他软件包以启动您的下一个项目。
您有一个可能需要指导的项目吗?请通过电子邮件发送至 hello@sebastiaanluca.com!