我的迁移是这样的:
$table->bigIncrements('id');
$table->timestamp('from_date');
$table->timestamp('to_date');
$table->timestamps();
问题是,当我迁移它时,第二个
from_date
自动获取 on update CURRENT_TIMESTAMP
属性,因此这意味着当我更新其他列时,该列也会更新。这就是我不想要的。我该如何预防?
此行为是 MySQL 固有的。您可以在此文档页面上阅读相关内容:
除非明确指定,否则和TIMESTAMP
列没有自动属性,但以下情况除外:如果禁用DATETIME
系统变量,则第一个explicit_defaults_for_timestamp
列同时具有TIMESTAMP
和DEFAULT CURRENT_TIMESTAMP
(如果两者都没有)明确指定。ON UPDATE CURRENT_TIMESTAMP
文档继续指出有两种策略可以避免这种行为:
DEFAULT
或使该列可为空。您需要将 DateTime 列设为可为空,然后 MySQL 不会添加该列。默认情况下,MySQL 将其添加到表中的第一个时间戳中,除非明确告知不要这样做(通过允许字段为空值)。这是 MySQL 的事情,而不是 Laravel 的事情。
$table->timestamp('colName')->nullable();
阅读:
TIMESTAMP 和 DATETIME 自动初始化和更新 - MYSQL DOCS
Laravel 和 MySQL 自动添加“on update current_timestamp()”到时间戳字段
来源:laracasts - 如何阻止 Laravel 制作时间戳
on update CURRENT_TIMESTAMP
?
您可以将
nullable
添加到列中以删除约束。
$table->timestamp('from_date')->nullable();
不幸的是,我认为这是唯一的解决方案。然后您可以添加表单验证以防止设置字段的
null
值。
--编辑
$table->timestamp('from_date')->default(DB::raw('CURRENT_TIMESTAMP'));
// or
$table->timestamp('from_date')->useCurrent();
也试试这个,我相信这就是
created_at
所拥有的。