Laravel迁移中如何为expire_at设置默认值为当前时间1年后?
解决Laravel中expire_at字段默认值为当前时间1年后的问题
你的代码存在两个核心问题:
timestamps()方法是批量创建created_at和updated_at两个时间戳字段的专用方法,无法单独定义单个expire_at字段,需使用单数形式的timestamp()方法。- 数据库无法解析字符串
'1 year from now'作为默认值,必须用数据库原生函数或Laravel的时间处理逻辑实现。
以下提供两种可行方案:
方案一:数据库层面设置默认值(推荐,直接在迁移中配置)
通过DB::raw()调用数据库原生函数设置默认值,不同数据库语法略有差异:
MySQL/MariaDB
use Illuminate\Support\Facades\DB; // 在迁移文件的up()方法中 $table->timestamp('expire_at')->default(DB::raw('CURRENT_TIMESTAMP + INTERVAL 1 YEAR'));
PostgreSQL
use Illuminate\Support\Facades\DB; $table->timestamp('expire_at')->default(DB::raw("CURRENT_TIMESTAMP + INTERVAL '1 year'"));
方案二:模型层面设置默认值(适合跨数据库兼容场景)
利用Eloquent模型的创建事件自动赋值,借助Carbon扩展处理时间:
// 在对应Eloquent模型中 use Carbon\Carbon; protected static function boot() { parent::boot(); // 模型创建时自动设置expire_at static::creating(function ($model) { $model->expire_at = Carbon::now()->addYear(); }); }
使用此方案时,迁移文件只需定义字段类型即可(无需设置数据库默认值):
$table->timestamp('expire_at')->nullable(); // 是否nullable根据业务需求调整
内容的提问来源于stack exchange,提问作者Malik Muhammad Awan
相关产品推荐
相关产品推荐

