Laravel评论评分防重复投票实现方案及技术选型咨询
现有评论评分逻辑代码
控制器代码
public function rating_change(Request $request, Comment $comment) { if ($request['action'] == 'up') { $comment->positive_rating = $comment->positive_rating + 1; } else if ($request['action'] == 'down') { $comment->negative_rating = $comment->negative_rating + 1; } $comment->save(); return ['positive' => $comment->positive_rating, 'negative' => $comment->negative_rating]; }
路由代码
Route::put('/comments_rating/{comment}', function (Comment $comment, Request $request) { $commentController = new CommentController(); return $commentController->rating_change($request, $comment); });
模型代码
class Comment extends Model { use HasFactory; protected $fillable = [ 'body', 'user_id', 'item_id' ]; protected $casts = [ 'user_id' => 'integer', 'item_id' => 'integer', ]; public function author() { return $this->belongsTo(User::class, 'user_id'); } public function post() { return $this->belongsTo(Items::class, 'id'); } }
资源代码
return [ 'id' => $this->id, 'user_id'=>$this->user_id, 'body'=>$this->body, 'created_at' => Date::parse($this->created_at)->diffForHumans(), 'updated_at' => $this->updated_at->format('Y-m-d H:i'), 'author'=>[ 'id'=>$this->author->id, 'name'=>$this->author->name, ], 'rating'=>[ 'positive'=>$this->positive_rating, 'negative'=>$this->negative_rating ] ];
需求与问题解答
需求:服务端拦截同一用户多次修改评论评分的操作,向前端返回操作状态标识(如是否修改成功)
1. 是否需要创建单独的数据表来存储所有用户的评分操作记录?
需要。要实现重复操作拦截,必须记录**用户ID、评论ID、操作类型(up/down)**这三个核心关联信息,单独的数据表(比如命名为comment_ratings)能清晰维护用户与评论的评分关联关系,既方便快速校验用户是否已操作,也支持后续扩展(比如允许用户取消评分、统计用户评分行为、回溯操作记录等)。
2. 该场景下使用Redis还是SQL存储更合适?
- 若核心需求是高并发下快速拦截重复操作,对持久化要求较低(可接受极端情况少量数据丢失),Redis更合适:可以用
user:{user_id}:comment:{comment_id}作为键,操作类型作为值,校验速度远快于SQL。 - 若需要持久化所有评分记录、支持复杂查询(比如统计某用户的全部评分行为、某评论的评分明细),或需要与其他业务数据关联(比如用户封禁后回溯违规评分),SQL数据库(如MySQL)更合适,数据稳定性和扩展性更强。
- 实际项目中可结合两者:用Redis做前置快速校验,同时异步将记录写入SQL做持久化。
3. Laravel是否有内置的解决方案或可用的第三方库?
Laravel本身没有专门针对评论评分的内置功能,但可利用现有特性实现:
- 通过Eloquent模型创建
CommentRating模型,建立User与Comment的多对多关联,直接通过模型查询验证用户是否已评分。 - 自定义Laravel验证规则,在请求阶段校验用户是否已对当前评论进行过操作。
第三方库推荐:
laravel/likeable:封装了点赞/点踩的完整逻辑,支持防重复操作、统计计数,可直接集成到现有模型中使用。spatie/laravel-activitylog:若需要更全面的行为审计,可通过该库记录用户的所有评分操作,方便后续回溯。
内容的提问来源于stack exchange,提问作者Sergei Illarionov
相关产品推荐
相关产品推荐

