Eloquent:时间戳

时间:2018-05-03 13:40:15

标签: php laravel eloquent sql-timestamp

这是我的迁移架构:

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 collat​​e utf8mb4_unicode_ci)

我必须指出,当我删除其中一条timestamp2行时,它会起作用,但是当它们同时存在时它不会。并且$table->timestamp(...);模型尽可能是空的。我犯了错误吗?

我已阅读this post,但即使将Object.php更改为timestamp(...)时不再出现错误,我也只想要时间戳。

3 个答案:

答案 0 :(得分:2)

我在laracasts上找到了this解决方案:

nullableTimestamps()仅适用于默认字段created_atupdated_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()之间进行选择。