分享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数组实现无限分类,不使用数据库,不使用递归.
Dec 09 PHP
推荐个功能齐全的发送PHP邮件类
Jan 03 PHP
深入解析php模板技术原理【一】
Jan 10 PHP
php 多个submit提交表单 处理方法
Jul 07 PHP
PHP 图片上传实现代码 带详细注释
Apr 29 PHP
Window下PHP三种运行方式图文详解
Jun 11 PHP
百度站点地图(百度sitemap)生成方法分享
Jan 09 PHP
Yii框架调试心得--在页面输出执行sql语句
Dec 25 PHP
php微信公众号开发(4)php实现自定义关键字回复
Dec 15 PHP
php封装的mongodb操作类代码
Aug 06 PHP
使用laravel和ECharts实现折线图效果的例子
Oct 09 PHP
ThinkPhP+Apache+PHPstorm整合框架流程图解
Nov 23 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 的几个配置文件函数
2006/12/21 PHP
POSIX 风格和兼容 Perl 风格两种正则表达式主要函数的类比(preg_match, preg_replace, ereg, ereg_replace)
2010/10/12 PHP
PHP页面间传递值和保持值的方法
2016/08/24 PHP
yii2高级应用之自定义组件实现全局使用图片上传功能的方法
2016/10/08 PHP
php实现的二叉树遍历算法示例
2017/06/15 PHP
ECMAScript 基础知识
2007/06/29 Javascript
js cookies 常见网页木马挂马代码 24小时只加载一次
2009/04/13 Javascript
js算法中的排序、数组去重详细概述
2013/10/14 Javascript
iframe子页面获取父页面元素的方法
2013/11/05 Javascript
ExtJS判断IE浏览器类型的方法
2014/02/10 Javascript
jQuery中的read和JavaScript中的onload函数的区别
2014/08/27 Javascript
jQuery实现提交按钮点击后变成正在处理字样并禁止点击的方法
2015/03/24 Javascript
jQuery实现定时读取分析xml文件的方法
2015/07/16 Javascript
浅谈JavaScript超时调用和间歇调用
2015/08/30 Javascript
JavaScript在form表单中使用button按钮实现submit提交方法
2017/01/23 Javascript
Vue中如何实现轮播图的示例代码
2017/07/27 Javascript
解决Vue-cli npm run build生产环境打包,本地不能打开的问题
2018/09/20 Javascript
vue项目引入字体.ttf的方法
2018/09/28 Javascript
KOA+egg.js集成kafka消息队列的示例
2018/11/09 Javascript
javascript实现智能手环时间显示
2020/09/18 Javascript
Pycharm学习教程(1) 定制外观
2017/05/02 Python
python 实现在txt指定行追加文本的方法
2018/04/29 Python
Python中的单继承与多继承实例分析
2018/05/10 Python
python numpy存取文件的方式
2020/04/01 Python
Anaconda之conda常用命令介绍(安装、更新、删除)
2019/10/06 Python
Python模块的制作方法实例分析
2019/12/21 Python
Pytorch中的VGG实现修改最后一层FC
2020/01/15 Python
碧欧泉美国官网:Biotherm美国
2016/08/31 全球购物
简历自我评价怎么写呢?
2014/01/06 职场文书
学校查摆问题整改措施
2014/09/28 职场文书
护士先进个人总结
2015/02/13 职场文书
优秀团员主要事迹范文
2015/11/05 职场文书
廉洁自律心得体会2016
2016/01/13 职场文书
2017元旦晚会开幕词
2016/03/03 职场文书
浅谈Python实现opencv之图片色素的数值运算和逻辑运算
2021/06/23 Python
mysql数据库实现设置字段长度
2022/06/10 MySQL