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

Laravel多表查询报错:非静态方法不应被静态调用

解决Laravel关联模型静态调用错误&实现需求

首先,咱们先搞定你遇到的那个Non-static method...错误——问题出在控制器里的TeacherProfile::usertype()这行代码。usertype()是你定义的非静态关联方法,它是给TeacherProfile的实例用的(比如$teacher->usertype),不能直接通过类名静态调用哦。

结合你的实际需求(显示用户类型值为2的teacher数据),给你两种可行的解决方案:

方案一:从UserTypes模型出发(推荐,更贴合关联逻辑)

因为UserTypes和TeacherProfile是一对多关系,我们可以先找到类型值为2的用户类型,再关联取出对应的老师数据:

// 控制器代码
// 假设user_types表里标记类型的字段是id=2,如果是其他字段比如type,就改成where('type', 2)
$targetUsertype = UserTypes::where('id', 2)->with('teacher')->first();
return view('teachers.create')->compact('targetUsertype');

对应的视图代码:

@if($targetUsertype)
    @foreach($targetUsertype->teacher as $teacher)
        <input type="text" name="name" id="input-name" 
               class="form-control{{ $errors->has('name') ? ' is-invalid' : '' }}" 
               placeholder="" value="{{ $teacher->id }}" required autofocus>
    @endforeach
@endif

方案二:从TeacherProfile模型出发筛选

如果你想直接从老师表筛选出关联类型为2的记录,可以用whereHas方法:

// 控制器代码
$teachers = TeacherProfile::whereHas('usertype', function($query) {
    // 同样根据实际字段调整条件,比如where('type', 2)
    $query->where('id', 2);
})->get();
return view('teachers.create')->compact('teachers');

对应的视图代码:

@if($teachers->isNotEmpty())
    @foreach($teachers as $teacher)
        <input type="text" name="name" id="input-name" 
               class="form-control{{ $errors->has('name') ? ' is-invalid' : '' }}" 
               placeholder="" value="{{ $teacher->id }}" required autofocus>
    @endforeach
@endif

最后提个小细节:你原来视图里的value="$data->id"是错误写法,Laravel Blade里输出变量要加双大括号{{ }},不然会直接输出字符串$data->id而不是实际的ID值哦。

内容的提问来源于stack exchange,提问作者lili luna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 10:22:29