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 资讯?听说聪明的人都用上这个 插件 了呢!

Stay Hungry, Stay Foolish.