有关用户之间的相互关注这样的应用场景仍是很常见的 每一个平台都会有这样相似的需求 就好比Segmentfault和知乎php
固然还有最熟悉的Github
每一个人能够有关注者和粉丝shell
这里咱们去创建一个中间表 能够想象获得的是这张表里包含了两个用户的id
咱们能够去建立一个Model
json
$ php artisan make:model Follow -m
建立完咱们的表以后 咱们去完善下表的字段信息数组
Schema::create('follows', function (Blueprint $table) { $table->increments('id'); $table->integer('follower_id')->unsigned()->index(); $table->integer('followed_id')->unsigned()->index(); $table->timestamps(); });
定义完毕以后去迁移下数据表post
$ php artisan migrate
写完咱们的数据表 咱们是将关注的信息存放在follows
这个数据表的 由于这是用户与用户之间的关联
并非以前的用户与帖子或文章这样的模型关联 其实实现的道理是同样的 this
咱们就能够在User Model
里去定义对应的关联code
//用户关注 public function following() { return $this->belongsToMany(self::class,'follows','follower_id','followed_id')->withTimestamps(); } //用户的粉丝 public function followers() { return $this->belongsToMany(self::class,'follows','followed_id','follower_id')->withTimestamps(); } //关注用户 public function followThisUser($user) { return $this->following()->toggle($user); }
由于用户与用户之间也是一种多对多的关系 因此我将关注用户的方法写成followThisUser
对象
接下来就能够去定义相应的方法路由了 这里为了使用方便我定义了一个控制器路由
$ php artisan make:controller FollowController
首先咱们去定义一下咱们的路由rem
Route::post('/user/follow','FollowersController@follow');
若是用户去关注另外一个用户的话 只须要去执行follow
方法 而这个方法也是一个toggle
式的操做
固然咱们在执行
$follow = $user->followThisUser($userId)
这个方法是他会返回一个数组对象 若是是执行
attach
方法的话那么
$follow['attached']
是$userId
的值若是这样的话咱们就能够知道
followThis
这个方法究竟是执行了attach
仍是detach
方法了
那么接着咱们就能够去增长一个用户的粉丝数或者去通知用户发送一个消息这样的操做了
因此你能够在执行完成以后的逻辑是这样的
$follow = user()->followThisUser($userId); //若是用户关注了另外一个用户 if(count($followed['attached'])>0){ //能够去通知用户 修改用户的关注人数等数据 return response()->json(['followed' => true]); }
固然若是咱们须要拿到一个用户的关注的人和粉丝的话 能够去执行
$user->following
以及
$user->followers
这样的话咱们就能够拿到对应的用户数据信息了
其实整个实现起来就和咱们对一篇帖子进行点赞同样 只不过对象变成了用户与用户之间