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
相关产品推荐
相关产品推荐

