侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

8 个 Laravel 模型时间戳使用技巧

Laravel  /  管理员 发布于 8年前   234

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

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

更多laravel框架相关技术文章,请访问laravel教程栏目!

以上就是8 个 Laravel 模型时间戳使用技巧的详细内容,更多请关注其它相关文章!


  • 上一条:
    Laravel Eloquent 必备的实用技巧
    下一条:
    如何用laravel生成sitemap
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • Laravel 11.14版本发布 - 新的字符串助手和ServeCommand改进(0个评论)
    • Laravel 11.12版本发布 - Artisan的`make`命令自动剪切`.php `扩展(0个评论)
    • Laravel的轻量型购物车扩展包:binafy/laravel-cart(0个评论)
    • Laravel 11.11版本发布 - 查看模型中的第三方关系:show(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-07
    • 2017-08
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2020-10
    • 2020-11
    • 2021-01
    • 2021-02
    • 2021-03
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-04
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    • 2024-05
    • 2024-06
    • 2024-07
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客