Laravel判断用户是否关注页面,关联查询返回null问题求助
问题分析与解决方案
看起来你在Laravel里判断用户是否关注页面的关联查询上踩了个小坑,我来帮你拆解问题并给出修复方案:
核心问题所在
你当前的关联写法有两个关键错误:
- 关联类型用反了:
belongsTo表示当前模型(Page)属于另一个模型(Followers),但实际逻辑是一个Page可以被多个用户关注,所以应该用hasOne(针对单个用户的关注记录)或者hasMany(所有关注该页面的用户记录)。 - 关联定义中硬编码用户ID有风险:直接在关联里写
auth()->user()->id,如果没有用户登录会直接抛出错误,而且关联定义应该是通用的,查询条件可以动态附加。
另外,虽然你的外键参数看起来是对的,但关联类型错误直接导致了返回null。
修复方案
方案1:定义针对当前用户的关联(推荐)
修改Page模型的关联,返回当前用户对该页面的关注记录(存在则返回对象,不存在则返回null):
class Page extends Model { public function currentUserFollow() { // 先检查用户是否登录,避免未登录时报错 if (!auth()->check()) { return $this->hasOne(Followers::class, 'user_id')->whereRaw('1=0'); // 返回空关联 } // hasOne用于单个用户的关注记录,对应followers表中user_id=页面ID、type=1、follower_id=当前用户ID的记录 return $this->hasOne(Followers::class, 'user_id') ->where('type', 1) ->where('follower_id', auth()->id()); } }
使用方式:
$page = Page::with(['ptag', 'currentUserFollow'])->find(1); // 判断是否关注:如果currentUserFollow不为null则已关注 $isFollowed = !is_null($page->currentUserFollow);
方案2:通用关联+自定义判断方法
如果需要复用关注列表的逻辑,可以先定义通用的关联,再写一个判断当前用户是否关注的方法:
class Page extends Model { // 所有关注该页面的用户记录(type=1) public function followers() { return $this->hasMany(Followers::class, 'user_id')->where('type', 1); } // 判断当前用户是否关注该页面 public function isFollowedByCurrentUser() { // 未登录直接返回未关注 if (!auth()->check()) { return false; } // 使用exists()直接判断记录是否存在,性能更优 return $this->followers()->where('follower_id', auth()->id())->exists(); } }
使用方式:
$page = Page::find(1); $isFollowed = $page->isFollowedByCurrentUser();
为什么原代码返回null?
原代码用了belongsTo,Laravel会尝试在Followers表中找默认命名的page_id字段,但你的Followers表用的是user_id关联Page的id,再加上关联类型逻辑反转,最终找不到匹配的记录,所以返回null。
内容的提问来源于stack exchange,提问作者Valter Sousa Cardoso
相关产品推荐
相关产品推荐

