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

Laravel项目关联问题:LMS中无法显示课程创建者名称

解决Laravel LMS中课程关联用户名称显示的问题

咱们先拆解下你遇到的问题:你想通过Course模型关联到创建课程的教授用户并显示其名称,但当前的模型关联逻辑、视图代码存在几处问题,导致报错。下面一步步来修正:

1. 修正模型的关联关系

首先明确你的数据库逻辑:Course表的prof_id(你代码里写的字段)是外键,关联到User表的id,这是一对多关系——一个教授用户可以创建多个课程,一个课程只属于一个教授。

修正Course模型的关联

你当前用了hasOne是错误的,应该用belongsTo,同时要指定自定义外键(因为默认外键是user_id,而你用的是prof_id):

class Course extends Model { 
    protected $table = 'cours'; 
    public $timestamps = true; 
    protected $fillable = [ 'name', 'lien', 'type', 'level', 'theme_id', 'prof_id' ]; 
    // 修正:课程属于一个教授用户
    public function professor() { 
        // 参数说明:关联模型、当前表的外键、关联表的主键(可选,默认id)
        return $this->belongsTo(User::class, 'prof_id'); 
    } 
}

把方法名改成professor更语义化,你也可以保留user,但要明确这是关联教授的逻辑

修正User模型的关联

你当前用belongsToMany(多对多)是错误的,应该用hasMany(一对多):

class User extends Authenticatable { 
    use Notifiable; 
    protected $table = 'users'; 
    public $timestamps = true; 
    protected $fillable = [ 'pseudo', 'email', 'password', 'name', 'prenom', 'image' ]; 
    public function roles() { 
        return $this->belongsToMany(Role::class); 
    } 
    // 修正:一个用户可以拥有多个课程
    public function cours() { 
        // 参数说明:关联模型、关联表的外键、当前表的主键(可选)
        return $this->hasMany(Course::class, 'prof_id'); 
    } 
}

2. 修正视图代码

你的控制器里$cours = DB::table('Course')->...->get();返回的是集合对象,所以视图里必须先遍历单个课程,再调用关联的用户信息:

@if($cours->isNotEmpty())
@foreach($cours as $cour)
<tr> 
    <td class="align-middle">{{ $cour->name }}</td> 
    <td class="align-middle">{{ $cour->level}}</td> 
    <!-- 调用修正后的关联,显示教授的名称(比如name字段) -->
    <td class="align-middle">{{ $cour->professor->name }}</td> 
</tr> 
@endforeach 
@endif

如果存在课程未关联教授的情况,为避免报错,可以用optional($cour->professor)->name来做容错处理

3. 可选:用Eloquent替代Query Builder优化性能

你当前用DB::table的方式属于Query Builder,无法自动使用模型关联,还容易产生N+1查询问题。建议改用Eloquent查询,同时预加载关联:

public function afficheFormation($id) { 
    // 用Eloquent查询Formation模型(假设你有对应的Formation模型)
    $formation = \App\Models\Formation::findOrFail($id);
    // 预加载课程的教授关联,避免N+1查询
    $cours = \App\Models\Course::whereHas('formations', function($query) use ($id) {
        $query->where('formation_id', $id);
    })->with('professor')->get();
    
    // 如果你已经在Formation模型里定义了和Course的多对多关联,还可以更简洁:
    // $formation = \App\Models\Formation::with('cours.professor')->findOrFail($id);
    // 此时视图里直接遍历$formation->cours即可
    
    return view('formation', compact('formation', 'cours')); 
}

常见报错排查

  • 若出现Trying to get property 'name' of non-object:说明存在课程的prof_id为null,或关联的用户不存在,用optional($cour->professor)->name可避免报错
  • 若出现Call to undefined method Illuminate\Database\Query\Builder::professor():说明你用了Query Builder而非Eloquent模型,Query Builder返回的是普通对象,没有模型关联方法,需改用Eloquent查询

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 16:52:47