版权声明: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请求(失败或者成功)