Laravel项目index.blade报Trying to get property of non-object错误求助
嘿,我来帮你排查这个问题!这个报错的核心原因其实很清晰:你在index.blade.php里尝试访问$product->category->name,但有某个产品的category关联是null(非对象),所以调用->name的时候就触发了这个错误。虽然你说没修改index方法,但创建/edit视图后,大概率是新增了没有关联有效分类的产品,或者数据库里原本就存在categories_id为空/无效的记录。
下面是具体的排查和解决步骤:
1. 先揪出数据库里的“问题数据”
先去检查你的products表,看看有没有categories_id字段为null,或者这个ID在categories表中找不到对应记录的产品。如果有,要么给这些产品补上有效的分类ID,要么在视图里做容错处理。
2. 视图层面快速修复(立竿见影)
在访问关联属性前,先判断关联是否存在,有两种常用方式:
方式一:用Laravel的optional()辅助函数
这个函数专门用来安全访问对象属性,即使对象是null也不会报错:
<td><b>{{ optional($product->category)->name }}</b></td>
如果category是null,这里会输出空字符串,不会抛出错误。
方式二:手动加条件判断
要是你想给无分类的产品显示友好提示,可以这么写:
<td><b>{{ $product->category ? $product->category->name : '未分类' }}</b></td>
3. 修复控制器里的致命逻辑错误(根源解决)
我看了你的store方法,发现一个严重问题:你先创建了产品,再做请求验证!这会导致无效数据(比如categories_id为空)直接存入数据库,这就是你新增产品后index页面报错的直接原因!
正确的逻辑应该是先验证请求数据,通过后再创建产品,而且要加上exists规则确保分类ID是有效的:
public function store(Request $request) { // 第一步:先验证请求数据,确保分类ID合法 $this->validate($request, [ 'product_code' => '', 'name' => '', 'categories_id' => 'required|integer|exists:categories,id', // 新增exists验证,确保分类存在 'wh1_limit_warning' => 'required|integer', 'wh2_limit_warning' => 'required|integer', 'price' => 'required|integer', 'selling_price' => 'required|integer', 'user_id' => 'required|integer', ]); // 第二步:验证通过后再创建产品 $product = Products::create($request->only( 'product_code', 'name', 'categories_id', 'wh1_limit_warning', 'wh2_limit_warning', 'price', 'selling_price', 'user_id' )); flash('New product added!'); return redirect(route('products.index')); }
4. 模型关联的小优化(可选,让代码更规范)
虽然这不是报错的原因,但Laravel的模型命名规范是单数形式(比如Product而非Products,Category而非Categories),遵循规范后关联定义可以更简洁:
比如修改Products模型为Product后,关联可以简化成:
public function category() { return $this->belongsTo(Category::class); }
这样Laravel会自动匹配外键category_id,不过你现在用的是categories_id,所以如果不想改数据库字段,保持原来的关联写法也没问题。
总结一下
问题的根源是store方法的验证顺序错误,导致无效的分类ID被存入数据库,加上视图里没有做容错处理,所以报错。解决步骤:
- 修复
store方法的验证逻辑,确保先验证再创建产品; - 清理数据库中
categories_id无效的产品记录; - 在视图中添加关联属性的安全访问逻辑,避免后续再踩坑。
内容的提问来源于stack exchange,提问作者SleepWalker

