Answers:
给定它是原始表达式,您应该使用它DB::raw()
来设置CURRENT_TIMESTAMP
列的默认值:
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
这在每个数据库驱动程序上都可以完美运行。
新捷径
从Laravel 5.1.25开始(请参阅PR 10962并提交15c487fe),可以使用新的useCurrent()
列修饰符方法将设置CURRENT_TIMESTAMP
为列的默认值:
$table->timestamp('created_at')->useCurrent();
回到问题,在MySQL上,您还可以ON UPDATE
通过DB::raw()
以下方式使用子句:
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
MySQL
从MySQL 5.7开始,0000-00-00 00:00:00
不再被视为有效日期。如Laravel 5.2升级指南中所述,在将记录插入数据库时,所有时间戳列均应收到有效的默认值。您可以useCurrent()
在迁移中使用column修饰符(来自Laravel 5.1.25及更高版本)将timestamp列默认为当前时间戳,或者可以使timestamps nullable()
允许空值。
PostgreSQL&Laravel 4.x
在Laravel 4.x版本中,PostgreSQL驱动程序使用默认的数据库精度来存储时间戳值。在CURRENT_TIMESTAMP
具有默认精度的列上使用函数时,PostgreSQL会生成具有更高可用精度的时间戳,从而生成带有小数秒部分的时间戳- 请参见此SQL提琴。
这将导致Carbon无法解析时间戳,因为它不会期望存储微秒。为了避免这种意外行为破坏您的应用程序,您必须对函数明确给出零精度,CURRENT_TIMESTAMP
如下所示:
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP(0)'));
从Laravel 5.0开始,将timestamp()
列更改为使用默认精度零,从而避免了这种情况。
感谢@andrewhl在评论中指出了这个问题。
要同时创建created_at
和updated_at
列:
$t->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
$t->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP'));
您将需要MySQL版本> = 5.6.5来包含多个列 CURRENT_TIMESTAMP
$table->timestamps()->default(DB::raw('CURRENT_TIMESTAMP'));
?
updated_at
在最初创建记录后对其进行修改时,该记录不会更改
$t->timestamps();
但是不能回答问题。
这对于事实不起作用:
$table->timestamp('created_at')->default('CURRENT_TIMESTAMP');
它不会删除选择时间戳似乎附带的“默认0”,而只是附加自定义默认值。但是我们有点需要没有引号。并非所有操纵数据库的东西都来自Laravel4。那是他的意思。他希望在某些列上自定义默认值,例如:
$table->timestamps()->default('CURRENT_TIMESTAMP');
我认为Laravel无法实现。我一直在搜索一个小时,以查看是否有可能。
更新: Paulos Freita的答案表明这是可能的,但是语法并不简单。
请改用Paulo Freitas的建议。
在Laravel解决此问题之前,您可以在运行标准数据库查询之后Schema::create
运行它。
Schema::create("users", function($table){
$table->increments('id');
$table->string('email', 255);
$table->string('given_name', 100);
$table->string('family_name', 100);
$table->timestamp('joined');
$table->enum('gender', ['male', 'female', 'unisex'])->default('unisex');
$table->string('timezone', 30)->default('UTC');
$table->text('about');
});
DB::statement("ALTER TABLE ".DB::getTablePrefix()."users CHANGE joined joined TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL");
它为我创造了奇迹。
在Laravel 5中:
$table->timestamps(); //Adds created_at and updated_at columns.
文档:http : //laravel.com/docs/5.1/migrations#creating-columns
CURRENT_TIMESTAMP
on created_at
column和on UPDATE CURRENT_TIMESTAMP
on updated_at
column的问题。拉维尔(Laravel)的耕人们要修复它,请使用: $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP'));
DB::statement
例子,这要简单得多。