如何从模型获取ID?用户模型中登录用户关注判断的ID获取问题
看起来你在这里搞混了关联方向和逻辑,我来帮你理清楚并修正这个问题~
问题分析
你想要实现的是:判断当前登录用户是否关注了正在被查看资料的用户(也就是当前User模型实例对应的用户)。但原函数的逻辑有点绕,而且关联方向不对——$this->hasMany('App\Follow', 'user_id')定义的是“当前用户作为关注者,他关注的所有人”,和你实际需求的方向刚好相反,同时用when分支处理登录状态也可以更简化。
解决方案
我们可以在User模型里写一个更直观的方法,直接实现判断逻辑:
方法1:利用关联关系(推荐,复用性高)
先定义followers关联(代表关注当前用户的粉丝),再基于这个关联判断登录用户是否在粉丝列表中:
// User.php use Illuminate\Support\Facades\Auth; use App\Follow; // 定义关联:关注我的人(粉丝) public function followers() { return $this->hasMany(Follow::class, 'followed_id'); } // 判断登录用户是否关注了当前用户 public function isFollowedByAuthUser() { // 未登录直接返回false if (!Auth::check()) { return false; } // 检查登录用户是否在当前用户的粉丝列表里 return $this->followers() ->where('user_id', Auth::id()) ->exists(); }
方法2:直接查询Follow表(更简洁,无需额外关联)
如果不需要复用followers关联,也可以直接写查询逻辑:
// User.php use Illuminate\Support\Facades\Auth; use App\Follow; public function isFollowedByAuthUser() { if (!Auth::check()) { return false; } return Follow::where([ 'user_id' => Auth::id(), 'followed_id' => $this->id ])->exists(); }
关于你提到的「获取被查看用户的ID」
其实这个ID就是当前User模型实例的$this->id——当你在控制器中获取被查看的用户(比如$profileUser = User::findOrFail($id)),调用$profileUser->isFollowedByAuthUser()时,$this->id就是这个被查看用户的ID,而登录用户的ID可以通过Auth::id()直接获取,完全不需要额外去“获取”。
使用示例
在控制器中传递用户到视图:
// ProfileController.php public function show($id) { $user = User::findOrFail($id); return view('profile.show', compact('user')); }
在视图中根据判断结果显示对应按钮:
<!-- profile/show.blade.php --> @if($user->isFollowedByAuthUser()) <button class="btn btn-secondary">已关注</button> @else <form action="{{ route('follow.store', $user) }}" method="POST"> @csrf <button class="btn btn-primary" type="submit">关注</button> </form> @endif
这样就可以完美实现你想要的功能啦~
内容的提问来源于stack exchange,提问作者Bartosz Rudziński
相关产品推荐
相关产品推荐

