分享8个Laravel模型时间戳使用技巧小结


Posted in PHP onFebruary 12, 2020

 默认情况下,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);

就这样,快速但希望有用的提示!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php输出echo、print、print_r、printf、sprintf、var_dump的区别比较
Jun 21 PHP
PHP实现手机号码中间四位用星号(*)隐藏的自定义函数分享
Sep 27 PHP
高质量PHP代码的50个实用技巧必备(下)
Jan 22 PHP
PHP Echo字符串的连接格式
Mar 07 PHP
Yii2分页的使用及其扩展方法详解
May 23 PHP
yii2中结合gridview如何使用modal弹窗实例代码详解
Jun 12 PHP
PHP实现适用于文件内容操作的分页类
Jun 15 PHP
PHP中串行化用法示例
Nov 16 PHP
php中引用符号(&)的使用详细介绍
Dec 06 PHP
详解PHP使用Redis存储session时的一个Warning定位
Jul 05 PHP
php把字符串指定字符分割成数组的方法
Mar 12 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
Feb 27 PHP
tp5.0框架隐藏index.php入口文件及模块和控制器的方法分析
Feb 11 #PHP
thinkphp5框架路由原理与用法详解
Feb 11 #PHP
php数组指针函数功能及用法示例
Feb 11 #PHP
PHP实现单例模式建立数据库连接的方法分析
Feb 11 #PHP
php-7.3.6 编译安装过程
Feb 11 #PHP
PHP实现Markdown文章上传到七牛图床的实例内容
Feb 11 #PHP
TP5(thinkPHP5)框架使用ajax实现与后台数据交互的方法小结
Feb 10 #PHP
You might like
PHP+SQL 注入攻击的技术实现以及预防办法
2011/01/27 PHP
php删除指定目录的方法
2015/04/03 PHP
浅谈php常用的7大框架的优缺点
2020/07/20 PHP
JavaScript 对象的属性和方法4种不同的类型
2010/03/19 Javascript
jquery 模拟类搜索框自动完成搜索提示功能(改进)
2010/05/24 Javascript
jQuery实现用方向键控制层的上下左右移动
2013/01/13 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(三)情景对话中仿打字机输出文字
2013/01/23 Javascript
简单选项卡 js和jquery制作方法分享
2014/02/26 Javascript
JS实现无限级网页折叠菜单(类似树形菜单)效果代码
2015/09/17 Javascript
javaScript事件学习小结(四)event的公共成员(属性和方法)
2016/06/09 Javascript
探索Javascript中this的奥秘
2016/12/11 Javascript
JavaScript调试之console.log调试的一个小技巧分享
2017/08/07 Javascript
jQuery使用zTree插件实现可拖拽的树示例
2017/09/23 jQuery
10个在JavaScript开发中常遇到的BUG
2017/12/18 Javascript
webpack下实现动态引入文件方法
2018/02/22 Javascript
Angular ui-roter 和AngularJS 通过 ocLazyLoad 实现动态(懒)加载模块和依赖
2018/11/25 Javascript
深入理解vue-class-component源码阅读
2019/02/18 Javascript
基于Bootstrap和JQuery实现动态打开和关闭tab页的实例代码
2019/06/10 jQuery
vue图片上传组件使用详解
2019/12/23 Javascript
vue+axios全局添加请求头和参数操作
2020/07/24 Javascript
vue 使用 sortable 实现 el-table 拖拽排序功能
2020/12/26 Vue.js
Python入门_浅谈字符串的分片与索引、字符串的方法
2017/05/16 Python
Numpy掩码式数组详解
2018/04/17 Python
Python利用openpyxl库遍历Sheet的实例
2018/05/03 Python
python2.7实现爬虫网页数据
2018/05/25 Python
python最长回文串算法
2018/06/04 Python
python爬虫 urllib模块反爬虫机制UA详解
2019/08/20 Python
pycharm专业版远程登录服务器的详细教程
2020/09/15 Python
Python爬虫爬取有道实现翻译功能
2020/11/27 Python
HTML5 source标签:媒介元素定义媒介资源
2018/01/29 HTML / CSS
美国著名珠宝品牌之一:Jared The Galleria Of Jewelry
2016/10/01 全球购物
For Art’s Sake官网:手工制作的奢华眼镜
2018/12/15 全球购物
阿迪达斯希腊官方网上商店:adidas希腊
2019/04/06 全球购物
人力资源经理的岗位职责
2014/03/02 职场文书
经典团队口号
2014/06/06 职场文书
2019年世界儿童日宣传标语
2019/11/22 职场文书