Laravel插入数组到数据库时报array to string conversion错误如何解决?
错误原因
你将PHP数组直接赋值给了Notification模型的link属性,而数据库中对应的link字段为字符串类型(varchar/text等),Laravel Eloquent默认不会自动完成数组到合法字符串的转换,执行save()方法时PHP尝试直接将数组转为字符串就会触发array to string conversion错误。
解决方法
推荐优先使用Laravel原生的类型转换功能,两种可选方案:
方案1:使用模型$casts属性(官方推荐)
这个方案可以实现自动转换,存数据时自动把数组转成JSON字符串写入数据库,读取数据时自动把JSON转回数组使用:
- 先确认数据库
notifications表的link字段类型为json或者longText,如果是迁移文件的话写法如下:
// 通知表迁移文件对应字段写法 $table->json('link'); // 优先用json类型,兼容性和查询效率更好 // 也可以使用 $table->longText('link');
- 在
Notification模型中添加$casts属性配置:
class Notification extends Model { // 其他已有属性、方法保留 protected $casts = [ 'unread' => 'boolean', // 可顺便为布尔类型字段加转换,保证读取时数据类型正确 'link' => 'array', // 配置link字段自动在数组和JSON之间转换 ]; }
配置完成后原有业务代码不需要做任何修改,直接执行即可正常保存数据。
方案2:手动序列化数组
如果你不想修改模型配置,可以手动把数组转为JSON字符串后再赋值:
// 将原来的 $notif->link = $link; 替换为下面的写法 $notif->link = json_encode($link); $notif->save(); // 后续读取该字段使用时,手动转回数组即可 $linkArray = json_decode($notif->link, true);
内容的提问来源于stack exchange,提问作者Ardhillah Alfath
相关产品推荐
相关产品推荐

