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

Laravel报错Property [id] does not exist on collection修复方法

问题原因

触发这个报错的直接原因是Blade模板里写了$images->id:$images是多条图片记录组成的Collection集合对象,不是单条数据模型实例,本身不存在直接的id属性。
除此之外你的代码还有3个会导致功能异常的隐藏问题:

  • DOWNLOAD按钮用了<button>标签加href属性,原生button不支持href,点击不会触发跳转
  • 控制器里刚查询完图片集合,下一行就把$images变量赋值为空数组,后续循环拿不到任何图片数据,打包出来的zip是空的
  • Blade模板里@push('css')没有对应@endpush闭合标签,标签嵌套结构也有缺失,会导致模板编译异常、页面布局错乱
修复步骤

1. 修正Blade模板代码

下载接口需要的参数是Rekap记录的主键id,你传给视图的$data就是单条Rekap模型实例,直接取$data->id传参即可,同时修正标签错误和结构问题:

@extends('layout.admin')

@push('css')
{{-- 这里放你需要引入的css --}}
@endpush {{-- 补上css块的闭合标签 --}}

@section('content')
<body>
    <h1 class="text-center mb-4" >Data Rekap</h1>
    <div class="container mb-5">
        <h2>Dokumentasi  Customer : <span class="text-primary">{{$data->customer}}</span> </h2>
        <a href="/rekap" class="btn btn-primary">Kembali</a>
        {{-- 把button改成a标签,参数替换为$data->id --}}
        <a href="/download_image/{{ $data->id }}" class="btn btn-primary center">DOWNLOAD</a>

        @foreach ($images as $image)
        <div class="row mt-4">
            <div class="col-md-3">
                <div class="card" style="max-width: 50rem;">
                    <div class="card-body">
                        <img src="{{asset('images_rekap/'.$image->image)}}" class="card-img-top mb-2">
                        <a href="/deleteimagerekap/{{ $image->id }}" class="btn btn-primary center">HAPUS</a>
                    </div>
                </div>
            </div>
        </div>
        @endforeach {{-- 把循环闭合标签移到正确位置 --}}
    </div>

    @push('script')
    <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-fQybjgWLrvvRgtW6bFlB7jaZrFsaBXjsOMm/tB9LTS58ONXgqbR9W8oWht/amnpF" crossorigin="anonymous"></script>
    @endpush
</body>
@endsection

2. 修正控制器下载方法的逻辑错误

把存储图片路径的数组和查询结果的变量分开,补全路径拼接、目录创建、文件存在性判断的容错逻辑:

public function download_image($id)
{
    // 查询关联的图片记录,变量名不要和后续存储路径的数组冲突
    $imageList = image_rekap::where('rekap_id',$id)->get();
    $imagePaths = [];
    foreach ($imageList as $image) {
        // 拼接路径时补全目录分隔符,避免路径拼接错误
        $imagePaths[$image->id] = public_path('images_rekap/'.$image->image);
    }

    $data = rekap::find($id);
    // 加判断避免查询不到数据时触发空对象报错
    if (!$data) {
        return redirect()->back()->with('error', '对应记录不存在');
    }

    $folderName = $data->id.'-'.str_replace(' ', '-',$data->customer);
    $zip = new ZipArchive;
    // 存储zip的目录不存在时自动创建,避免open失败
    $zipDir = public_path('image_rekap/'.$folderName);
    if (!is_dir($zipDir)) {
        mkdir($zipDir, 0755, true);
    }
    $zipFile = $zipDir.'/'.$folderName.'.zip';

    if ($zip->open($zipFile, ZipArchive::CREATE | ZipArchive::OVERWRITE) === TRUE)
    {
        foreach ($imagePaths as $imgId => $imgPath) {
            // 只把真实存在的文件加入压缩包,避免报错
            if (file_exists($imgPath)) {
                $zip->addFile($imgPath, basename($imgPath));
            }
        }
        $zip->close();
    }

    return response()->download($zipFile);
}
优化建议

模型类名建议遵循Laravel默认的大驼峰命名规范,比如将image_rekap改为ImageRekap、rekap改为Rekap,避免类名自动映射时出现找不到类的问题。

内容的提问来源于stack exchange,提问作者ken thoriqi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 22:42:33