Laravel报cleanBindings()参数需为数组类型错误的解决方法
Laravel
cleanBindings() 类型报错解决方案 错误根因
报错提示whereIn要求传入数组类型参数,但实际拿到的是字符串:
你在数据库中存储singers_id时使用的是JSON格式字符串(如["2","4"]),Laravel默认不会自动将该字段值转换为PHP数组,读取出来的$album->singers_id是字符串类型,直接传给要求数组参数的whereIn方法就会触发类型错误。
解决方法
方案1:模型配置类型转换(推荐,一劳永逸)
在Album模型中配置字段类型转换,框架会自动完成JSON字符串和PHP数组的双向转换:
- 打开
app/Models/Album.php文件 - 在模型内添加
$casts配置:
protected $casts = [ // 保留你模型里已有的其他字段转换配置 'singers_id' => 'array', ];
配置完成后,无需修改Blade内现有业务代码,读取singers_id字段时会自动返回数组类型,whereIn参数符合要求,报错消失。
方案2:手动解码JSON(临时处理方案)
如果暂时不想修改模型配置,可以在使用该字段前手动通过json_decode将JSON字符串转为数组,修改Blade内代码如下:
@php // 第二个参数传true,指定解码后返回数组而非stdClass对象 $singerIds = json_decode($album->singers_id, true); $names = DB::table('singers')->whereIn('id', $singerIds)->pluck('singers_name')->toArray(); @endphp {{ implode(' & ', $names) }}
额外优化建议
不推荐在Blade模板中直接编写数据库查询逻辑,不符合MVC分层规范,还容易引发N+1查询问题。你可以在Album模型中定义和Singer模型的关联关系,控制器查询时直接预加载关联数据,模板直接读取关联属性即可,性能和可维护性更好。
内容的提问来源于stack exchange,提问作者vignesh
相关产品推荐
相关产品推荐

