You need to enable JavaScript to run this app. Laravel与Livewire开发点赞系统时如何仅删除当前用户的对应点赞
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 12:06:07