Laravel 11报错:Attempt to read property "name" on int 求助
排查“Attempt to read property "name" on int”错误步骤
这个错误的核心是你在整数类型的值上调用了name属性,大概率是Blade模板里误将外键ID(比如category_id)当成关联模型对象(category)来使用,或者关联定义/预加载存在问题,按以下步骤排查:
1. 检查Blade模板代码
这是最常见的出错点,确认你没有写成:
{{ $product->category_id->name }}
正确的写法应该是调用关联关系名称:
{{ $product->category->name }} {{ $product->subcategory->name }}
如果有部分产品的关联可能为空,建议使用可选链式调用避免后续报错:
{{ $product->category?->name }} {{ $product->subcategory?->name }}
2. 验证模型关联定义
打开Product模型,确认关联关系的外键配置正确:
// app/Models/Product.php public function category() { // 若products表的外键是category_id,且Category模型主键是id,可省略参数 return $this->belongsTo(Category::class, 'category_id', 'id'); } public function subcategory() { return $this->belongsTo(Subcategory::class, 'subcategory_id', 'id'); }
注意:如果Category/Subcategory模型使用了非默认主键(比如uuid或自定义字段),必须在belongsTo的第三个参数指定对应主键字段。
3. 确认预加载是否生效
在控制器中临时添加调试代码,查看预加载后的模型数据:
// 控制器方法内 $products = Product::with(['category', 'subcategory'])->get(); dd($products);
查看输出结果,每个Product对象中应该包含category和subcategory的模型实例(而非单纯的ID)。如果看不到这两个关联对象,说明关联关系定义错误,导致预加载失败。
4. 检查数据表外键约束
打开products表的迁移文件,确认外键字段的类型与关联表的主键类型一致:
// 示例迁移代码 Schema::create('products', function (Blueprint $table) { $table->id(); $table->foreignId('category_id')->constrained(); // 确保category_id与categories表的id类型匹配 $table->foreignId('subcategory_id')->constrained(); // 其他字段... });
如果关联表的主键不是unsignedBigInteger(比如是integer),需要显式指定外键类型:
$table->integer('category_id')->unsigned(); $table->foreign('category_id')->references('id')->on('categories');
内容的提问来源于stack exchange,提问作者Michael Grznár
相关产品推荐
相关产品推荐

