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
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 8

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

6年前 评论
liux156

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

5年前 评论
awesee

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

5年前 评论
liux156

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

5年前 评论
Sunn 4年前
awesee

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

5年前 评论

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

5年前 评论
awesee

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

5年前 评论

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

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!