You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 17:55:28