Laravel技巧集锦(十一):使用关联模型(关注-粉丝)

版权声明:http://www.itchuan.net https://blog.csdn.net/sinat_37390744/article/details/88144420

思路分析:

我的粉丝  一对多 hasMany

我关注的人 一对多 hasMany

1、在model User.php中

返回当前登录用户(我)的粉丝

//查找我的粉丝意味着这里我是明星,我的角色是star_id
public function fans(){
        return $this->hasMany(\App\Fan::class,'star_id','id');
}

返回当前登录用户(我)关注的人

//查找我关注的人,意味着这里我是别人的粉丝,我的角色是fan_id
public function stars(){
     return $this->hasMany(\App\Fan::class,'fan_id','id');
}

我关注别人

//uid 是我要关注的人的id,别人的角色是明星 $uid 就是 star_id
public function doUnfan($uid){
        $fan = new \App\Fan();
        $fan->star_id = $uid;
        return $this->stars()->save($fan);
}

我取消关注别人

//uid 是我要关注的人的id,别人的角色是明星 $uid 就是 star_id
public function doUnfan($uid){
        $fan = new \App\Fan();
        $fan->star_id = $uid;
        return $this->stars()->delete($fan);
}

当进入A的主页时,判断当前登录用户是否为A的粉丝

//A为明星
public function hasStar($uid){
        return $this->stars()->where('star_id',$uid)->count();
}

2、路由

Route::web('/user/{user}/fan','UserController@fan');
Route::web('/user/{user}/unfan','UserController@unfan');

3、视图

判断当前用户是否关注A,若已经关注了A,则显示 取消关注 按钮;若没有关注A,则显示 关注 按钮

@if($target_user->id != \Auth::id())//自己进自己主页,则不显示按钮
<div>
    @if(\Auth::user()->hasStar($target_user->id)) 
    <button class="btn btn-default like-button" like-value="1" like-user="{{$target_user->id}}" _token="" type="button">取消关注</button>
    @else
        <button class="btn btn-default like-button" like-value="0" like-user="{{$target_user->id}}" _token="" type="button">关注</button>
    @endif
</div>
@endif

js中ajax关注/取消关注

$.ajaxSetup({
    headers:{
        'X-CSRF-TOKEN':$('meta[name="csrf-token"]').attr('content')
    }
});


$('.like-button').click(function (event) {

    var target = $(event.target);
    var current_like = target.attr('like-value');
    var user_id = target.attr('like-user');

    if(current_like==1){
        $.ajax({
            url:'/user/' + user_id + '/unfan',
            method:"POST",
            dataType:"json",
            success:function (data) {
                console.log(data);
                if(data.error!=0){
                    alert(data.msg);
                    return;
                }

                target.attr('like-value',0);
                target.text('关注');
            }
        });
    }else{

        $.ajax({
            url:'/user/' + user_id + '/fan',
            method:"POST",
            dataType:"json",
            success:function (data) {
                if(data.error!=0){
                    alert(data.msg);
                    return;
                }

                target.attr('like-value',1);
                target.text('取消关注');
            }
        });
    }


});

2、UserController.php中处理关注、取消关注

//路由中传递的是模型,我要关注的人 User Model  
 public function fan(User $user){
        $me = \Auth::user();
        $me->doFan($user->id);
        return [
            'error'=>0,
            'msg'=>'关注失败'
        ];

    }

//路由中传递的是模型,我要取消关注的人 User Model  
    public function unfan(User $user){
        $me = \Auth::user();
        $me->doUnfan($user->id);
        return [
            'error'=>0,
            'msg'=>'取消关注失败'
        ];
     }

总结(以关注过程为例)

点击关注按钮发起ajax请求  》》 /user/{user}/fan   》》 控制器调用模型中的fan方法 再返回ajax请求(失败或者成功)  

猜你喜欢

转载自blog.csdn.net/sinat_37390744/article/details/88144420
今日推荐