如何正确实现数据表插入时间和更新时间的设计?

发布于 2022-09-11 14:56:40 字数 783 浏览 17 评论 0

在使用eloquent时,通过官方文档看到可以自定义插入字段和更新字段名,附链接https://laravel-china.org/doc...
接下来先给出数据表的设计:

CREATE TABLE `plans`(
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `title` varchar(100) NOT NULL,
  `content` mediumtext,
  `status` tinyint(1) NOT NULL DEFAULT 0,
  `create_time` TIMESTAMP,
  `update_time` TIMESTAMP,
  PRIMARY KEY(id),
  FOREIGN KEY(user_id) REFERENCES users(id)
)ENGINE=INNODB;

因为我使用的是mysql5.6版本,所以支持设置两个timestamp类型,但是这样设置后,创建时两个时间相同我理解,但是在我更新数据后,两个字段还是相同的更新后的时间,我特别不能理解,然后我试了一段时间,弃用了这种方式,于是我使用了原生语句,在更新时,同时更新update_time为当前时间,但是发现create_time同样也是进行了更新,还是两个时间段能相同,我想问在不改变数据表字段类型的前提下有没有好的方法,因为我做的小项目都快完了,才发现这个问题,想找到一个好的解决办法

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

拥抱影子 2022-09-18 14:56:40

你现在的逻辑,每次操作,都会同时对create_time和update_time两个字段操作。这两个字段需要定义成选填,然后数据从客户端传过来,不应该从数据库层面计算。理论上在数据库计算问题不大,但是实际需求中,如果用户时间点卡得比较准,那用户保存的时间是9:59:59,但是数据库触发保存可能就是10点了,这时候数据就是错的了。所以你所有的数据都应该从客户端取得,无论是create_time还是update_time,都是用户点保存按钮的那一时刻,不应该是数据在数据库触发保存动作的时间。如果考虑网络等其他因素,你的数据偏差可能更大。

寻梦旅人 2022-09-18 14:56:40

因为在建表时create_time timestamp,默认是timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,可以通过show create table plans确认一下。这种情况,这一行数据被更新的话,create_time这个字段就会自动更新为now()了。
解决方法可以是在建表的时候显示指定create_time timestamp default current_timestamp,这样就不会被默认加上ON UPDATE CURRENT_TIMESTAMP了,也就是create_time字段不会默认在更新的时候一起自动更新了。

如若梦似彩虹 2022-09-18 14:56:40

你可以尝试创建单独的model

namespace App\Models;

    use Illuminate\Database\Eloquent\Model;

    class Article extends Model
    {
        public $timestamps = false;
        
        public $table = 'article';
    }

并禁止时间自动更新,并手动更新时间字段

扬花落满肩 2022-09-18 14:56:40

create_timeCURRENT_TIMESTAMPS去掉,update_time加上,创建数据的时候手动赋值创建时间

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文