IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Laravel 用户之间关注

    JellyBean发表于 2017-03-29 19:26:55
    love 0

    介绍

    有关用户之间的相互关注这样的应用场景还是很常见的 每个平台都会有这样类似的需求 就比如Segmentfault和知乎

    当然还有最熟悉的Github每个人可以有关注者和粉丝

    建立模型表

    这里我们去建立一个中间表 可以想象得到的是这张表里包含了两个用户的id 我们可以去创建一个Model

    $ 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();
    });

    定义完毕之后去迁移下数据表

    $ php artisan migrate

    定义模型方法

    写完我们的数据表 我们是将关注的信息存放在follows这个数据表的 因为这是用户与用户之间的关联
    并不是之前的用户与帖子或文章这样的模型关联 其实实现的道理是一样的

    我们就可以在User Model里去定义对应的关联

    //用户关注
    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

    首先我们去定义一下我们的路由

    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

    这样的话我们就可以拿到对应的用户数据信息了

    其实整个实现起来就和我们对一篇帖子进行点赞一样 只不过对象变成了用户与用户之间



沪ICP备19023445号-2号
友情链接