分享8个laravel模型时间戳使用技巧

默认情况下,Laravel Eloquent 模型默认数据表有 created_at 和 updated_at 两个字段。当
然,我们可以做很多自定义配置,实现很多有趣的功能。下面举例说明。
1. 禁用时间戳
如果数据表没有这两个字段,保存数据时 Model::create($arrayOfValues); —— 会看到 SQL
error。Laravel 在自动填充 created_at / updated_at 的时候,无法找到这两个字段。
禁用自动填充时间戳,只需要在 Eloquent Model 添加上一个属性:
class Role extends Model
{
public $timestamps = FALSE;
// ... 其他的属性和方法
}
2. 修改时间戳默认列表
假如当前使用的是非 Laravel 类型的数据库,也就是你的时间戳列的命名方式与此不同该怎
么办? 也许,它们分别叫做 create_time 和 update_time。恭喜,你也可以在模型种这么
定义:
class Role extends Model
{
const CREATED_AT = 'create_time';
const UPDATED_AT = 'update_time';
3. 修改时间戳日期 / 时间格式
以下内容引用官网文档 official Laravel documentation:
默认情况下,时间戳自动格式为 'Y-m-d H:i:s'。 如果您需要自定义时间戳格式,可以在你的
模型中设置 $dateFormat 属性。这个属性确定日期在数据库中的存储格式,以及在序列化成
数组或 JSON 时的格式:
class Flight extends Model
{
/**
* 日期时间的存储格式
*
* @var string */
protected $dateFormat = 'U';
}
4. 多对多:带时间戳的中间表
当在多对多的关联中,时间戳不会自动填充,例如 用户表 users 和 角色表 roles 的中间
表 role_user。
在这个模型中您可以这样定义关系:
class User extends Model
{
public function roles()
{
return $this->belongsToMany(Role::class);
}
}
然后当你想用户中添加角色时,可以这样使用:
$roleID = 1;
$user->roles()->attach($roleID);
默 认 情 况 下 , 这 个 中 间 表 不 包 含 时 间 戳 。 并 且 Laravel 不 会 尝 试 自 动 填 充
created_at/updated_at
但是如果你想自动保存时间戳,您需要在迁移文件中添加 created_at/updated_at,然后在模
型的关联中加上 ->withTimestamps();
public function roles()
{
return $this->belongsToMany(Role::class)->withTimestamps();
}
5. 使用 latest() 和 oldest() 进行时间戳排序
使用时间戳排序有两个 “快捷方法”。
取而代之:
User::orderBy('created_at', 'desc')->get();
这么做更快捷:
User::latest()->get();
默认情况,latest() 使用 created_at 排序。
与之对应,有一个 oldest() ,将会这么排序 created_at ascending
User::oldest()->get();
当然,也可以使用指定的其他字段排序。例如,如果想要使用 updated_at,可以这么做:
$lastUpdatedUser = User::latest('updated_at')->first();
6. 不触发 updated_at 的修改
无论何时,当修改 Eloquent 记录,都将会自动使用当前时间戳来维护 updated_at 字段,
这是个非常棒的特性。
但是有时候你却不想这么做,例如:当增加某个值,认为这不是 “整行更新”。
那么,你可以一切如上 —— 只需禁用 timestamps,记住这是临时的:
$user = User::find(1);
$user->profile_views_count = 123;
$user->timestamps = false;
$user->save();
7. 仅更新时间戳和关联时间戳
与上一个例子恰好相反,也许您需要仅更新 updated_at 字段,而不改变其他列。
所以,不建议下面这种写法:
$user->update(['updated_at' => now()]);
您可以使用更快捷的方法:
$user->touch();
另一种情况,有时候您不仅希望更新当前模型的 updated_at,也希望更新上级关系的记录。
例如,某个 comment 被更新,那么您希望将 post 表的 updated_at 也更新。
那么,您需要在模型中定义 $touches 属性:
class Comment extends Model {
protected $touches = ['post'];
public function post()
{
return $this->belongsTo('Post');
}
}
8. 时间戳字段自动转换 Carbon 类
最后一个技巧,但更像是一个提醒,因为您应该已经知道它。
默认情况下,created_at 和 updated_at 字段被自动转换为 $dates,
所以您不需要将他们转换为 Carbon 实例,即可以使用 Carbon 的方法。
例如:
$user->created_at->addDays(3);
now()->diffInDays($user->updated_at);
就这样,快速但希望有用的提示!
有需要学习交流的友人请加入交流群的咱们一起,群内都是1-7年的开发者,希望可以一起交流,探讨swoole这块的技术 或者有其他php问题 也可以问,获取swoole或者php进阶相关资料私聊管理即可

分享8个laravel模型时间戳使用技巧的更多相关文章
- PHP程序Laravel框架的优化技巧
Laravel是一套简洁.优雅的php Web开发框架(PHP Web Framework).它可以让你从杂乱的代码中解脱出来,可以帮你构建一个完美的网络app,而且每行代码都简洁.富于表达力.而性能 ...
- Laravel 模型事件入门
Laravel 模型事件允许你监听模型生命周期内的多个关键点,甚至可以在阻止一个模型的保存或者删除. Laravel 模型事件文档 概述了如何使用钩子将对应事件与相关的事件类型关联起来,但是本文的主旨 ...
- 50分钟学会Laravel 50个小技巧
50分钟学会Laravel 50个小技巧 时间 2015-12-09 17:13:45 Yuansir-web菜鸟 原文 http://www.yuansir-web.com/2015/12/09 ...
- Facebook内部分享:25个高效工作的小技巧
Facebook内部分享:25个高效工作的小技巧 Facebook 内部分享:不论你如何富有,你都赚不到更多的时间,你也回不到过去.没有那么多的假如,只有指针滴答的时光飞逝和你应该好好把握的现在,以下 ...
- 50分钟学会Laravel 50个小技巧(基于laravel5.2,仅供参考)
转载请注明:转载自 Yuansir-web菜鸟 | LAMP学习笔记 本文链接地址: 50分钟学会Laravel 50个小技巧 原文链接:< 50 Laravel Tricks in 50 Mi ...
- Linux查看History记录加时间戳小技巧
Linux查看History记录加时间戳小技巧 熟悉bash的都一定知道使用history可以输出你曾经输入过的历史命令,例如[root@servyou_web ~]# history | more ...
- laravel模型中非静态方法也能静态调用的原理
刚开始用laravel模型时,为了方便一直写静态方法,进行数据库操作. <?php namespace App\Models; use Illuminate\Database\Eloquent\ ...
- Laravel模型事件的实现原理详解
模型事件在 Laravel 的世界中,你对 Eloquent 大多数操作都会或多或少的触发一些模型事件,下面这篇文章主要给大家介绍了关于Laravel模型事件的实现原理,文中通过示例代码介绍的非常详细 ...
- Laravel 5 性能优化技巧
说明 性能一直是 Laravel 框架为人诟病的一个点,所以调优 Laravel 程序算是一个必学的技能. 接下来分享一些开发的最佳实践,还有调优技巧,大家有别的建议也欢迎留言讨论. 这里是简单的列表 ...
随机推荐
- 异数OS TCP协议栈测试(一)--数据传输篇
异数OS TCP协议栈测试(一)--数据传输篇 本文来自异数OS社区 github: 异数OS-织梦师(消息中间件)群: 476260389 测试目标 数据传输IO性能测试,主要是建立连接后测试收 ...
- 外网主机远程ssh局域网Linux
最近,公司有台配置极高的主机盒子(i7,32G,512G),组长让我装上kali,平时渗透测试时可以用,其余时间归我了,这么高配置的机器,怎么舍得让它吃灰呢 .所以我就去研究了一下,如何远程访问局域网 ...
- Python3 正则表达式 re 模块的使用 - 学习笔记
re 模块的引入 re 模块的使用 re.compile() re.match()与re.search() re.match re.search() 区别 re.findall()与re.findit ...
- 开源项目SMSS发开指南(四)——SSL/TLS加密通信详解
本文将详细介绍如何在Java端.C++端和NodeJs端实现基于SSL/TLS的加密通信,重点分析Java端利用SocketChannel和SSLEngine从握手到数据发送/接收的完整过程.本文也涵 ...
- [校内训练20_01_19]ABC
1.SB题 2.有n个点,m条边,每次加入一条边,你要挑出一些边,使得形成的图每个点度数都为奇数,且最长的边最短. 3.给一个N次多项式,问有多少个质数在任意整数处的点值都是p的倍数,输出它们.$N ...
- FTP服务后门利用
开门见山 1. 扫描同网段的靶场机,发现PCS,192.168.31.137 2. 扫描靶场机服务信息和服务版本 3. 快速扫描靶场机全部信息 4. 发现开放ftp服务,并扫描此ftp软件版本是否存在 ...
- spring cloud oauth2搭建认证中心与资源中心
一 认证中心搭建 添加依赖,如果使用spring cloud的话,不管哪个服务都只需要这一个封装好的依赖即可 <dependency> <groupId>org.springf ...
- os 模块 的常用方法讲解
import osprint(os.getcwd()) #拿到当前文件的目录os.chdir(r'E:\pycharm 5.3 wenjian weizhi ')#改变当前脚本的工作目录 'r'表示原 ...
- 学习记录一(Python算数运算符与if语句)
从网上找到一个Python的学习视频,之前的环境都装好了,今天看的就是算术运算符和变量的命名 其中Python的除法直接就是 / %用于求余 其中还可以进行幂运算** 例如2 ** 3 = 8 ...
- PAT乙级(Basic Level)真题,福尔摩斯的约会
题目描述 大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm”.大侦探很快就明 ...