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
相关产品推荐
相关产品推荐

