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

Laravel如何实现用户点赞功能并查询当前用户已点赞的用户列表

表结构评估与调整建议

你现有的表结构基本可以满足点赞功能的需求,有3个可优化的点供你参考:

  • 字段命名建议调整:liked_the_user 改为更通用的 liked_user_id,符合Laravel关联字段的命名惯例,后续写关联的时候不需要额外指定外键,减少代码冗余
  • 如果后续要加点踩功能,建议加一个tinyint类型的type字段:值为1代表点赞,2代表点踩,不用额外建点踩的关联表,一张表就能同时支持两种操作,扩展性更强。如果暂时不需要点踩,这个字段可以先不加
  • 建议给user_id和liked_user_id加联合唯一索引,避免同一个用户重复点赞同一个人的脏数据产生

调整后的favorite_user表迁移文件示例:

Schema::create('favorite_user', function (Blueprint $table) {
    $table->id();
    $table->foreignId('user_id')->constrained()->onDelete('cascade');
    $table->foreignId('liked_user_id')->constrained('users')->onDelete('cascade');
    // 如果需要支持点踩就加下面这行,默认值设为1代表点赞
    // $table->tinyInteger('type')->default(1)->comment('1=点赞 2=点踩');
    $table->unique(['user_id', 'liked_user_id']);
    $table->timestamps();
});

如果你暂时不想调整现有liked_the_user字段名,只需要把下文关联定义里的第四个参数liked_user_id替换为liked_the_user即可正常使用。

关联关系定义

这是典型的用户和用户之间的自引用多对多关系,直接在User模型里定义关联即可:

// app/Models/User.php
class User extends Model
{
    // 获取当前用户点赞的所有用户
    public function likedUsers()
    {
        return $this->belongsToMany(User::class, 'favorite_user', 'user_id', 'liked_user_id');
    }

    // 可选:获取点赞了当前用户的所有用户
    public function likedByUsers()
    {
        return $this->belongsToMany(User::class, 'favorite_user', 'liked_user_id', 'user_id');
    }
}

功能实现示例

1. 添加/取消点赞

// 给id为2的用户点赞
auth()->user()->likedUsers()->attach(2);

// 取消对id为2的用户的点赞
auth()->user()->likedUsers()->detach(2);

// 切换点赞状态(已经点了就取消,没点就加上)
auth()->user()->likedUsers()->toggle(2);

2. 获取已点赞的用户列表

// 分页获取当前用户点赞的用户列表
$likedUsers = auth()->user()->likedUsers()->paginate(10);

// 全量获取当前用户点赞的用户列表
$likedUsers = auth()->user()->likedUsers;

内容的提问来源于stack exchange,提问作者user16675203

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 20:39:01