ThinkPHP批量添加含JSON字段数据需声明模型的$json属性并确保数据为数组或对象;用模型saveAll()自动序列化,Db::insertAll()需手动json_encode();可选配置$jsonType和$jsonAssoc控制类型绑定与返回格式。

ThinkPHP批量添加含JSON字段的数据,核心在于两件事:一是确保JSON字段被框架识别为可序列化类型,二是保证批量写入时结构不被破坏、值能正确存入数据库。不能直接把数组当普通字段塞进去,否则会报错或存成字符串。
模型中必须声明JSON字段
在对应模型类里,用$json属性明确告诉框架哪些字段是JSON类型:
-
ThinkPHP 5.1 / 6.x 都适用:在模型中加
protected $json = ['info', 'settings']; - 字段名必须和数据库列名完全一致(大小写敏感)
- 如果字段不是真正的JSON类型(比如MySQL的TEXT),但内容是合法JSON格式,也建议声明——框架会自动
json_encode()和json_decode()
批量插入时数据格式要规范
传给insertAll()或saveAll()的每条记录中,JSON字段必须是数组或对象,不能是JSON字符串:
- ✅ 正确:
['name' => '张三', 'info' => ['email' => 'a@b.com', 'level' => 2]] - ✅ 也可用对象:
'info' => (object)['email' => 'a@b.com'] - ❌ 错误:
'info' => '{"email":"a@b.com"}'(字符串会被原样存入,不解析也不转义)
若用Db::insertAll()(跳过模型),JSON字段不会自动处理,必须提前json_encode();而用模型的saveAll($data, ['batch'=>true])则会自动序列化。
立即学习“PHP免费学习笔记(深入)”;
注意JSON字段的类型绑定(可选但推荐)
如果JSON里有整型、布尔等非字符串字段,查询时想保持类型,可在模型中加$jsonType:
protected $jsonType = ['info->user_id' => 'int', 'info->is_vip' => 'boolean'];- 这样用
where('info->user_id', 1001)查时,参数会按int绑定,避免隐式类型转换出错 - 不定义则默认全部按字符串处理
批量写入后读取JSON字段要配$jsonAssoc(按需)
默认返回对象($user->info->email),如需数组访问($user->info['email']),在模型中加:
protected $jsonAssoc = true;- 该设置不影响写入,只影响读取时的解码方式



















