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 collate 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'))
)之间进行选择。
【讨论】:
我认为所有数据类型都必须可以为空或具有默认值。 这不是真的,例如VARCHAR
和INT
可以是不可空的并且没有默认值。您只需在插入过程中填写值。
WTF Mysql!?为什么我们不能像其他列一样只要求在插入时设置时间戳?真是头疼。【参考方案2】:
我在 laracasts 上找到了this 解决方案:
nullableTimestamps()
仅用于默认字段created_at
、updated_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 模型设置默认属性值?