Laravel报错:Attempt to read property 'name' on int 问题求助
错误原因分析
- 混淆外键字段与关联关系:
user_id是数据库中存储的整数类型外键,直接调用$item->user_id得到的是数字值,而非User模型实例,自然无法读取name属性。 - 关联方法与操作模型不匹配:你在
Work模型中定义了关联,但控制器实际查询的是Post模型,存在模型混淆;同时关联方法命名为User()(首字母大写),不符合Laravel驼峰小写的关联调用约定。 - 变量传递与循环命名不一致:控制器将
$posts以post为键名传递给视图,视图循环时使用单数$post,虽不直接引发当前错误,但易导致逻辑混乱。
解决方案
步骤1:修正模型关联(核心)
如果控制器操作的是Post模型,需在Post模型中定义正确的关联方法(若实际业务是Work模型,则控制器应改为Work::all()):
// app/Models/Post.php public function user() { return $this->belongsTo(User::class); }
注:关联方法名使用小写
user,Laravel会自动匹配外键user_id,符合框架约定。
步骤2:修正视图中的关联调用
将视图中访问外键的代码改为调用关联关系:
<tbody> @foreach ($posts as $item) <tr class="border-b dark:border-neutral-500"> <td class="whitespace-nowrap px-6 py-4 font-medium">{{ $item->id}}</td> <td class="whitespace-nowrap px-6 py-4">{{ $item->user?->name}}</td> <td class="whitespace-nowrap px-6 py-4">{{ $item->slug}}</td> </tr> @endforeach </tbody>
- 使用
$item->user调用关联关系,获取User模型实例后再访问name; - 加
?->可选链运算符,避免因user_id为空导致的报错(兼容Laravel 8+)。
步骤3:优化控制器查询(避免N+1问题)
在查询时预加载关联关系,提升性能,同时修正变量传递的键名:
// 控制器代码 $posts = Post::with('user')->get(); return view('home', ['posts' => $posts]);
内容的提问来源于stack exchange,提问作者Aditya Budi
相关产品推荐
相关产品推荐

