Laravel中save()与update()方法孰快?是否有专用增量函数?
关于Laravel博客访问量递增的优化方案
1. update()方法确实比你当前的save()更快
你现在的代码逻辑是先从数据库查询出$post对象,修改views值后再调用save()保存,这会触发两次SQL请求:一次SELECT查询获取数据,一次UPDATE更新数据。
如果改用update()结合DB::raw的写法,只需要一次SQL请求就能完成递增:
Post::where('id', $post->id)->update(['views' => DB::raw('views + 1')]);
这种方式跳过了查询对象的步骤,减少了数据库交互次数,在高访问量场景下性能差异会更明显。
2. Laravel有专门的递增函数:increment()
Laravel Eloquent提供了increment()方法,这是专门为数值字段递增设计的工具,用法非常简洁,而且内部会处理成数据库原子操作,能避免并发场景下的计数错误(比如多个请求同时递增时,不会出现少加的情况)。
常用的几种写法:
- 如果已经获取了
$post对象:
$post->increment('views');
- 直接通过模型ID操作(无需先查询对象,性能最优):
Post::where('id', $postId)->increment('views');
- 还可以指定递增的步长(比如一次加2):
$post->increment('views', 2);
三种方式对比
| 方式 | SQL请求次数 | 并发安全性 | 代码简洁度 |
|---|---|---|---|
| 你的当前代码 | 2次 | 不安全 | 一般 |
| update()+DB::raw | 1次 | 安全 | 一般 |
| increment() | 1次 | 安全 | 高 |
显然increment()是最优选择,既简洁又高效,还能解决并发问题。
内容的提问来源于stack exchange,提问作者Max Pattern
相关产品推荐
相关产品推荐

