Eloquent:带有时间戳的无效默认值

Posted

技术标签:

【中文标题】Eloquent:带有时间戳的无效默认值【英文标题】:Eloquent: Invalid default value with timestamps 【发布时间】:2018-10-13 20:30:55 【问题描述】:

这是我的迁移架构:

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 (id int unsigned not null auto_increment 主键,timestamp1 timestamp not null,timestamp2 timestamp not null) 默认字符集 utf8mb4 collat​​e utf8mb4_unicode_ci)

我必须指出,当我删除 2 个 $table->timestamp(...); 行之一时,它可以工作,但当两者都存在时,它就不行了。 Object.php 模型是空的。我是不是搞错了?

我已经阅读了this post,但是即使我将timestamp(...) 更改为dateTime(...) 时不再出现错误,我只想要时间戳

【问题讨论】:

create 语句对我来说很好用。你用的是什么版本的mysql 一张表中只有一个时间戳列,所以将其设为CHAR更新该列的数据类型。 【参考方案1】:

时间戳有点特殊,它们要么可以为空,要么必须有默认值。因此,您必须在 timestamp('timestamp1')->nullable();timestamp('timestamp1')->useCurrent() 或自定义默认值(如 timestamp('timestamp1')->default(DB::raw('2018-01-01 15:23')))之间进行选择。

【讨论】:

我认为所有数据类型都必须可以为空或具有默认值。 这不是真的,例如VARCHARINT 可以是不可空的并且没有默认值。您只需在插入过程中填写值。 WTF Mysql!?为什么我们不能像其他列一样只要求在插入时设置时间戳?真是头疼。【参考方案2】:

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

nullableTimestamps() 仅用于默认字段created_atupdated_at。对于自定义字段,请使用 timestamp()->nullable();

【讨论】:

但是如果我不希望这些时间戳可以为空怎么办?例如,如果我希望将它们设置为 CURRENT_TIMESTAMP。 你可以使用一个作为当前,但我不明白你为什么要使用两个作为当前 我不知道,我觉得奇怪的是,例如 INT 字段不必有默认值,但对于时间戳是强制性的。 第一个非空字段将设置为默认使用 CURRENT_TIMESTAMP。我想如果不能为空,一切都应该有一个默认值。 我发布了一个新的答案,因为我不知道如果我编辑了你的答案是否可以,因为可能会有错误。【参考方案3】:

您可以使用

使两个时间戳之一为空
timestamp()->nullable();

使用您的示例,您将使用:

$table->timestamp('timestamp2')->nullable();

laravel 还使用

内置了时间戳
$table->timestamps();

它会自动为您处理 updated_at 和 created_at 时间戳

【讨论】:

我知道timestamps(),我只是想让我的例子简单一点。

以上是关于Eloquent:带有时间戳的无效默认值的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Laravel / Eloquent 模型设置默认属性值?

“日期”的默认值无效

js配置下拉框默认值无效

“添加日期”的默认值无效

如何在 InfluxDB 中编辑测量值(= 带有时间戳的值集)?

联合字段的 Avro 无效默认值