Laravel Eloquent 的关系模型联动
本文翻译改变自 Povilas Korop 的 Eloquent Touch for Models and their Relationships (文章图片来源)
关于这个话题我想在这里写两个使用技巧。可能你会知道其中一个,但不知道另一个。也可能,你两个都不知道~
OK,进入正题之前,如果你不知道Eloquent 的表有 created_at 和 updated_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 协议》,转载必须注明作者和本文链接
前几天 @waacoo 同学刚好问了 Polymorphic Relations 中如何实现 Touching Parent Timestamps?
@Summer 按照你的方法,好像更新不了时间。最后读了PHPhub的源码,停用了自动更新,采用手动的方式。没好意思继续问,既然提及了,能否说的细点。
@waacoo 是什么原因更新不了时间呢?因为我试过上面的方法是可以更新的。
哇。这个方法学到了。很方便。