You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel判断用户是否关注页面,关联查询返回null问题求助

问题分析与解决方案

看起来你在Laravel里判断用户是否关注页面的关联查询上踩了个小坑,我来帮你拆解问题并给出修复方案:

核心问题所在

你当前的关联写法有两个关键错误:

  1. 关联类型用反了:belongsTo表示当前模型(Page)属于另一个模型(Followers),但实际逻辑是一个Page可以被多个用户关注,所以应该用hasOne(针对单个用户的关注记录)或者hasMany(所有关注该页面的用户记录)。
  2. 关联定义中硬编码用户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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:00:55