Laravel 8+PHP 8报错:Attempt to read property 'id' on bool 求助
问题分析
你遇到的Attempt to read property "id" on bool错误核心原因是变量名冲突+数据类型不匹配:
- 在
index()方法中,$category是所有分类的集合(Category::all()),layout视图通过@foreach遍历集合正常工作。 - 在
categories()方法中,你将单个分类模型实例赋值给了同名的$category变量,传给categories视图后,继承的layout会尝试遍历这个单个模型对象。遍历模型时会取出它的属性值(部分属性可能是布尔类型),此时$catego变成了布尔值,访问$catego->id自然触发错误。 - 另外,
categories()的else分支返回index视图时,未传递$category集合,也会导致layout遍历出错。
你提到修复后图片正常但头部分类显示“not found”,大概率是修改了单个分类的变量名,但忘记在categories页面传递所有分类的集合,导致layout里的$category未定义,??语法触发默认值。
解决方案
1. 区分变量名(核心)
把“所有分类集合”的变量名改为复数形式$categories,和单个分类模型的$category彻底区分:
控制器代码调整
// 注意:模型类名需遵循Laravel规范,首字母大写(Category、Image) use App\Models\Category; use App\Models\Image; function index(){ // 所有分类集合用复数变量名 $categories = Category::all(); return view('index')->with('categories', $categories); } function categories($id){ // 直接查找单个分类,找不到则返回提示页 $category = Category::find($id); if(!$category) { // 返回index视图时必须传递所有分类集合,供layout使用 $categories = Category::all(); return view('index')->with([ 'status' => 'category not exist', 'categories' => $categories ]); } $viewimage = Image::where('categories_id', $category->id)->get(); // 传递所有分类集合给categories视图,供layout遍历 $categories = Category::all(); return view('categories', compact('category', 'viewimage', 'categories')); }
2. 更新layout视图的遍历代码
将layout中遍历的变量从$category改为$categories,同时优化URL生成(使用路由命名更可靠):
头部遍历代码
{{-- 先给路由命名:Route::get('category/{id}', [...])->name('category.show'); --}} @foreach($categories as $catego) <li><a href="{{ route('category.show', $catego->id) }}">{{ $catego->categories }}</a></li> @endforeach
表单遍历代码
@foreach($categories as $catego) <option value="{{ $catego->id }}">{{ $catego->categories }}</option> @endforeach
3. 额外优化建议
- 模型类名首字母大写:Laravel遵循PSR-4自动加载规范,模型类名应改为
Category和Image,避免潜在的类找不到问题。 - 用
findOrFail()简化判断:如果分类不存在时直接返回404页面,可简化代码:
function categories($id){ $category = Category::findOrFail($id); $viewimage = Image::where('categories_id', $category->id)->get(); $categories = Category::all(); return view('categories', compact('category', 'viewimage', 'categories')); }
内容的提问来源于stack exchange,提问作者zeenat malik
相关产品推荐
相关产品推荐

