天天看點

Laravel技巧集錦(十一):使用關聯模型(關注-粉絲)

思路分析:

我的粉絲  一對多 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('取消關注');
            }
        });
    }


});      
//路由中傳遞的是模型,我要關注的人 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'=>'取消關注失敗'
        ];
     }