You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 13:01:22