
在 Laravel 中向 MySQL 的 JSON 字段插入关联数组时,若直接赋值 PHP 数组会触发 “Array to string conversion” 错误;正确做法是显式调用 json_encode() 将数组序列化为字符串,或利用 Laravel 的自动 JSON 处理机制。
在 laravel 中向 mysql 的 json 字段插入关联数组时,若直接赋值 php 数组会触发 “array to string conversion” 错误;正确做法是显式调用 `json_encode()` 将数组序列化为字符串,或利用 laravel 的自动 json 处理机制。
当你从外部 API 获取结构化数据(如多语言国家名称 ['en' => 'Georgia', 'ka' => 'საქართველო']),并希望将其持久化到声明为 JSON 类型的数据库字段(如 MySQL 5.7+ 或 PostgreSQL)时,Laravel 不会自动序列化 PHP 数组——它仅在模型中定义了 $casts 且字段类型支持时,才对读写进行透明的 JSON 编解码。若未正确配置,直接赋值数组会导致 PHP 尝试将数组转为字符串(触发错误),因为 Eloquent 默认将属性视为字符串处理。
✅ 正确写法(推荐两种方式):
方式一:手动 json_encode()(兼容所有 Laravel 版本)
foreach ($countries as $country) {
$api = new Country();
$api->code = $country['code'];
$api->name = json_encode([
'en' => $country['name']['en'] ?? '',
'ka' => $country['name']['ka'] ?? ''
], JSON_UNESCAPED_UNICODE); // 保留中文等 Unicode 字符不转义
$api->save();
}方式二:使用 $casts 自动处理(更优雅、Laravel 原生推荐)
在 Country 模型中声明:
// app/Models/Country.php
protected $casts = [
'name' => 'json',
];然后控制器中可直接赋值数组(Laravel 自动序列化):
foreach ($countries as $country) {
Country::create([
'code' => $country['code'],
'name' => [
'en' => $country['name']['en'] ?? '',
'ka' => $country['name']['ka'] ?? ''
]
]);
}⚠️ 注意事项:
- 确保数据库字段类型为 JSON(MySQL)或 jsonb/json(PostgreSQL);若为 TEXT,需手动 json_encode() 且查询时手动 json_decode();
- 使用 ?? '' 防止 Undefined index 错误,提升健壮性;
- JSON_UNESCAPED_UNICODE 参数避免中文被编码为 \uXXXX,提升可读性;
- 若使用 create(),请确保 Country 模型已设置 $fillable = ['code', 'name'];;
- 调试时可用 dd($api->getAttributes()) 查看实际写入值,确认 name 是字符串(含 JSON 格式)而非数组。
总结:根本原因在于 Eloquent 不会隐式序列化数组——要么手动 json_encode(),要么通过 $casts 启用自动 JSON 转换。后者更符合 Laravel 惯例,减少重复代码,也便于后续读取时自动反序列化为数组,真正实现“所写即所得”。


















