Laravel 自动将“更新 CURRENT_TIMESTAMP”添加到某些特定列

问题描述 投票:0回答:3

我的迁移是这样的:

$table->bigIncrements('id');
$table->timestamp('from_date');
$table->timestamp('to_date');
$table->timestamps();

问题是,当我迁移它时,第二个

from_date
自动获取
on update CURRENT_TIMESTAMP
属性,因此这意味着当我更新其他列时,该列也会更新。这就是我不想要的。我该如何预防?

laravel database-migration
3个回答
2
投票

此行为是 MySQL 固有的。您可以在此文档页面上阅读相关内容:

除非明确指定,否则

TIMESTAMP
DATETIME
列没有自动属性,但以下情况除外:如果禁用
explicit_defaults_for_timestamp
系统变量,则第一个
TIMESTAMP
列同时具有
DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP
(如果两者都没有)明确指定。

文档继续指出有两种策略可以避免这种行为:


2
投票

您需要将 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


1
投票

您可以将

nullable
添加到列中以删除约束。

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

不幸的是,我认为这是唯一的解决方案。然后您可以添加表单验证以防止设置字段的

null
值。

--编辑

$table->timestamp('from_date')->default(DB::raw('CURRENT_TIMESTAMP'));

// or
$table->timestamp('from_date')->useCurrent();

也试试这个,我相信这就是

created_at
所拥有的。

© www.soinside.com 2019 - 2024. All rights reserved.