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

