You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel迁移中如何为DATE类型列设置当前日期默认值?

解决Laravel中DATE类型列设置当前日期默认值的问题

针对你遇到的DATE类型列无法设置动态默认值的问题,这里提供几种可行的解决方案:

方案1:使用原生SQL语句操作列

Laravel的Schema构建器在处理DATE类型的默认值时可能存在语法生成问题,直接用原生SQL可以绕过这个限制。如果是新增列,在迁移文件里用DB::statement()执行原生ALTER语句:

public function up()
{
    DB::statement('ALTER TABLE your_table_name ADD COLUMN request_date DATE DEFAULT CURRENT_DATE AFTER issue_date');
    // 替换your_table_name为实际表名,AFTER子句可根据需求调整列的位置
}

public function down()
{
    DB::statement('ALTER TABLE your_table_name DROP COLUMN request_date');
}

方案2:通过模型事件设置默认值

如果不想依赖数据库层面的默认值,可以在模型的creating事件中自动填充当前日期,每次创建新记录时都会生效:

在对应模型类中添加:

protected static function boot()
{
    parent::boot();

    static::creating(function ($model) {
        $model->request_date = Carbon::today()->toDateString();
    });
}

这种方式不需要在迁移里设置默认值,只需将该列设为可空或允许默认null即可。

方案3:适配MySQL版本调整迁移写法

如果你的MySQL版本是5.7及以上(DATE类型支持CURRENT_DATE作为默认值),可以尝试在创建表时直接使用以下写法:

Schema::create('your_table_name', function (Blueprint $table) {
    // 其他列定义...
    $table->date('request_date')->default(DB::raw('CURRENT_DATE'));
});

注意:如果是修改表添加列,Laravel的Schema构建器可能生成错误的SQL,此时优先使用方案1的原生SQL写法。

报错原因说明

你尝试的DB::raw('CURRENT_DATE()')或date(now())写法存在两个问题:一是MySQL中DATE类型的默认值不能使用带括号的CURRENT_DATE()调用(CURRENT_DATE是关键字,无需括号);二是Laravel的Schema构建器在修改表时生成的SQL语法可能存在解析错误,导致数据库报错。

内容的提问来源于stack exchange,提问作者E. Galdamez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 06:13:22