Laravel Eloquent 的关系模型联动

file

本文翻译改变自 Povilas KoropEloquent Touch for Models and their Relationships (文章图片来源)

关于这个话题我想在这里写两个使用技巧。可能你会知道其中一个,但不知道另一个。也可能,你两个都不知道~

OK,进入正题之前,如果你不知道Eloquent 的表有 created_atupdated_at 这两个字段,那么恭喜你,现在你知道了。

一般来说,在你进行任何数据更新的时候 Eloquent 会自动帮你维护这两个字段,而现在我们要说的是,即便那一行数据里面没有任何更新,也可以更新 updated_at 这个字段。

请看代码:

$user = User::find(1);
$user->touch();

touch() 方法可以不需要更新其他字段就用当前时间戳对 updated_at 进行更新。这个方法用来保存 最后一次处理时间 亦或者是 用户最近一次活跃时间 是极好的。

除此之外还有 第二招。通过在 Eloquent 模型中的 touches 属性中添加模型关系的名称,也可以做到这件事情。而且我更喜欢这个办法:

class Comment extends Model {

    protected $touches = ['post'];

    public function post()
    {
        return $this->belongsTo('Post');
    }

}

$touches 数组中添加与这个模型关联的关系之后,只要这个模型被更新,就会立即更新数组中添加的关联模型的 updated_at 字段。而你只需要同往常一般操作模型即可:

$comment = Comment::find(1);
$comment->text = 'Edit to this comment!';
$comment->save();

这样一来,与这个 Comment 相关的 Post 就会获得一个新的 updated_at 值。这玩意真的真的非常有用,假设一个实体有很多关联关系,你可以不需要一个个去检查也能够对他们的 update_at 进行更新。

最后,我想鼓励你有空的时候尝试去阅读一下 Laravel 的源码,里面有很多隐藏的大招没有被记录在官方文档中,甚至也可能并不为多数人所知。例如你可以通过 GitHub 的这份文件在 Eloquent 中找到第一招里面的 touch() 以及其他没有出现在文档中的属性。最起码我认识的很多大牛都至少读了一遍 Laravel 的源码~

想第一时间查看第一手 Laravel 资讯?听说聪明的人都用上这个 插件 了呢!

本作品采用《CC 协议》,转载必须注明作者和本文链接
Stay Hungry, Stay Foolish.
本帖由 Summer 于 6年前 加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 4

@Summer 按照你的方法,好像更新不了时间。最后读了PHPhub的源码,停用了自动更新,采用手动的方式。没好意思继续问,既然提及了,能否说的细点。

6年前 评论

@waacoo 是什么原因更新不了时间呢?因为我试过上面的方法是可以更新的。

6年前 评论
protected $touches = ['post'];

哇。这个方法学到了。很方便。

5年前 评论

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