这是我的迁移架构:
public function up()
{
Schema::create('objects', function (Blueprint $table) {
$table->increments('id');
$table->timestamp('timestamp1');
$table->timestamp('timestamp2');
});
}
但是当我执行php artisan migrate
时,我收到此错误:
Illuminate \ Database \ QueryException:SQLSTATE [42000]:语法错误或访问冲突:1067 'timestamp2'的默认值无效(SQL:create table
objects
({{1} } int unsigned not null auto_increment主键,id
timestamp not null,timestamp1
timestamp not null)默认字符集utf8mb4 collate utf8mb4_unicode_ci)
我必须指出,当我删除其中一条timestamp2
行时,它会起作用,但是当它们同时存在时它不会。并且$table->timestamp(...);
模型尽可能是空的。我犯了错误吗?
我已阅读this post,但即使将Object.php
更改为timestamp(...)
时不再出现错误,我也只想要时间戳。
答案 0 :(得分:2)
我在laracasts上找到了this解决方案:
nullableTimestamps()
仅适用于默认字段created_at
,updated_at
。自定义字段使用timestamp()->nullable();
答案 1 :(得分:2)
您可以使用
使两个时间戳中的一个可以为空timestamp()->nullable();
使用您的示例,您将使用:
$table->timestamp('timestamp2')->nullable();
laravel还使用
内置了时间戳$table->timestamps();
会自动为您处理updated_at和created_at时间戳
答案 2 :(得分:1)
时间戳有点特殊,它们必须可以为空或者必须具有默认值。因此,您必须在modelBuilder.Entity<Table1>().HasKey(t => t.ID);
modelBuilder.Entity<Table1>().Property(t =>t.ID)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity<Table1>()
.HasOptional(t1 => t1.Table2)
.WithRequired(t2 => t2.Table1).Map(m => m.MapKey("ID"));
或timestamp('timestamp1')->nullable();
或自定义默认值timestamp('timestamp1')->useCurrent()
之间进行选择。