Laravel Eloquent关联报错Undefined property: stdClass::$category求助
解决Laravel中Undefined property: stdClass::$category的问题
嘿,我来帮你排查这个错误!你遇到的Undefined property: stdClass::$category问题,根源其实出在控制器的查询方式上,咱们一步步来解决:
问题原因
你在控制器里用了DB::table('formations')->paginate('4')来获取培训数据,这个方法返回的是stdClass对象的集合,而不是你定义的Formation模型实例。Eloquent的关联关系(比如你在模型里写的category()方法)只有在模型实例上才能生效,普通的数据库对象没有这个动态属性,所以视图里调用$formation->category->name就会报错。
解决方案(推荐第一种,更符合Laravel最佳实践)
方案1:使用Eloquent模型查询并预加载关联
把控制器里的查询代码改成用Formation模型来查询,同时预加载category关联(避免N+1查询问题,提升性能):
// 控制器代码修改为: $formations = Formation::with('category')->paginate(4); $categories = Category::all(); return view('formation.index',compact('categories','formations'));
这样返回的就是Formation模型实例集合,视图里原来的{{$formation->category->name}}就能正常工作了。
方案2:如果坚持用DB门面查询,手动关联表
如果你一定要用DB::table()的方式查询,需要手动join分类表并选择需要的字段:
$formations = DB::table('formations') ->join('categories', 'formations.category_id', '=', 'categories.id') ->select('formations.*', 'categories.name as category_name') ->paginate(4);
然后在视图里改成调用手动命名的字段:
<td>{{$formation->category_name}}</td>
额外提醒
- 确保你的
formations表确实存在category_id字段,并且和categories表的id字段正确关联 - 第一种方案是Laravel推荐的Eloquent用法,能充分利用模型的关联、事件等特性,更便于维护
内容的提问来源于stack exchange,提问作者Mohamed Midou
相关产品推荐
相关产品推荐

