Laravel & Lumen Eloquent 模型去掉 created_at 和 updated_at 其中一个

起因#

最近在用 Lumen 做 API 接口开发,开发接口要记录日志,日志存放在数据库。因为是日志数据,只需要 created_at 字段就可以了,如果设置 $timestamps = false, 两个都用不了,created_at 就需要自己手动设置了,如果不设置,数据库需要添加 updated_at 字段。下面是解决方法:

解决方法#

查看 Illuminate\Database\Eloquent\Model 后发现,有这样一行代码 use Concerns\HasTimestamps ,接下找到 trait HasTimestamps 看到 如下代码:

public function setUpdatedAt($value)
{
    $this->{static::UPDATED_AT} = $value;

    return $this;
}

聪明的你应该已经知道怎么解决了吧。没错,就是在 Model 中设置 const UPDATED_AT = null 就可以了。

总结#

遇到问题,先看文档,再尝试一下自己解决,最后去百度。

awesee
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 8

CreatePasswordResetsTable 这个 migration 里面是这样写的 $table->timestamp ('created_at')->nullable ();
然后 password_resets 表里面 确实是只有 created_at 字段

7年前 评论
liux156

傻不拉几的,还发教程.
在 Model 中设置 const UPDATED_AT = null 就可以了.
你难道去 vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php
这个文件中改源码呀.

6年前 评论
awesee

@liux156 没改源码,是在新建的 Model 中设置 const UPDATED_AT = null

6年前 评论
liux156

@Openset 受教了。在我爆出口的情况下,你还能耐心回复.
在你回复之前,我一直都认为,类常量就跟常量一样的,一旦声明就不能修改.
现在才知道原来是可以修改的.
这么说来,类常量,跟静态变量是一样的.

6年前 评论
Sunn 5年前
awesee

@liux156 如果你需要自定义用于存储时间戳的字段名,可以在模型中通过设置 CREATED_AT 和 UPDATED_AT 常量来实现,另外这种方式不推荐。

6年前 评论

@Openset 为什么不推荐这种方法,开发中使用时间戳不是最灵活的吗?

6年前 评论
awesee

@pengjianwei MySQL created_atupdated_at 添加 默认值就行了, updated_at 可以添加 ON UPDATE CURRENT_TIMESTAMP 就可以了

6年前 评论

@liux156 类常量本来就是不能改的。本例中的类常量不是同一个,分别属于父类和子类。

6年前 评论