Laravel中如何读取Voyager存储在产品表的多图路径字段值
Laravel Voyager多文件上传字段读取报错解决方案
报错根本原因
- 两个报错属于典型的类型不匹配问题:
htmlspecialchars()报错是因为json_decode($product->photo, true)返回的是数组,而Blade的{{ }}输出标签默认会对字符串做转义处理,不能直接接收数组参数- foreach报错是因为直接读取的
$product->photo是原始的JSON字符串,不是可遍历的数组类型
最优解决方案(推荐)
直接在Product模型中添加字段类型转换,让Laravel自动处理JSON的编解码,无需每次手动调用json_decode:
- 打开
app/Models/Product.php文件,在模型的属性中添加$casts配置:
protected $casts = [ // 其他字段转换规则 'photo' => 'array', ];
- 配置完成后,
$product->photo会自动转为数组类型,空值或者无效JSON会返回null,可在Blade中直接按如下方式遍历:
@if(is_array($product->photo) && count($product->photo)) @foreach ($product->photo as $imgPath) <img src="{{ asset('storage/' . $imgPath) }}" alt="产品图片"> @endforeach @endif
注意:Voyager默认将上传文件存储在
storage/app/public目录下,需要先执行php artisan storage:link创建软链才能正常访问静态资源。
临时处理方案(不改模型)
如果不想修改模型配置,可以在输出前手动做兼容处理,避免报错:
@php $photos = json_decode($product->photo, true) ?: []; @endphp @foreach ($photos as $imgPath) <img src="{{ asset('storage/' . $imgPath) }}" alt="产品图片"> @endforeach
这里用
?: []做兜底处理,就算字段值为null、空字符串或者无效JSON,也会返回空数组,不会触发foreach参数错误的问题。
内容的提问来源于stack exchange,提问作者Rui Leming
相关产品推荐
相关产品推荐

