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
相关产品推荐
相关产品推荐

