Laravel与Livewire开发点赞系统时如何仅删除当前用户的对应点赞
问题核心
你现在的点赞判断、删除逻辑没有加用户维度的筛选,调用$this->collection->likes()默认取的是目标内容下所有用户的点赞数据,才会出现一删就把全量点赞清掉、能重复新增多条点赞的问题。
调整步骤
1. 修正查询的筛选条件
原来的判断逻辑没有限定当前用户,所有操作都要加上对应用户ID的匹配:
原来的问题代码:
if($this->collection->likes()->exists()){ return $this->collection->likes()->delete(); }
修改为仅匹配当前登录用户的点赞记录:
// 只查当前用户对这条内容的点赞 $hasLiked = $this->collection->likes()->where('user_id', auth()->id())->exists(); if ($hasLiked) { // 只删当前用户的那一条,不会碰其他用户的数据 return $this->collection->likes()->where('user_id', auth()->id())->delete(); }
2. 数据库层加唯一约束兜底
代码层的判断挡不住异常场景(比如用户快速连点两次、网络重试重复提交、代码逻辑漏写),要在likes表加复合唯一索引,从根源上保证单用户对单条内容只能有1条点赞记录:
在创建likes表的迁移文件里加:
// 把多态关联类型、关联内容ID、用户ID三个字段绑定成唯一组合,不能重复 $table->unique(['likeable_type', 'likeable_id', 'user_id'], 'user_single_like_rule');
3. 用Laravel内置方法简化逻辑
Laravel的关联系统自带toggle()方法,专门适配这种“点一次加、再点取消”的场景,不需要手动写判断、增删的分支,改完整个方法会非常简洁:
public function storeLike() { // 自动识别当前用户对这条内容的点赞状态:存在就删,不存在就加 // 全程只操作当前用户的记录,不会影响其他用户的点赞 $this->collection->likes()->toggle(auth()->user()->id); }
适配你的混合内容场景没有额外成本:只要
Post、Urls、News三个模型都正确定义了指向Like的多态关联,遍历集合渲染的时候不需要针对不同类型的内容单独写点赞逻辑。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

