thinkphp json字段支持需mysql≥5.7、字段类型为json、查询用->json()或->>>语法、模型中同时配置$json和$type属性,缺一不可。

ThinkPHP 数据库配置文件本身不直接支持 JSON 字段配置,所谓“JSON 字段支持”实际是指框架在运行时操作 MySQL 5.7+ 原生 JSON 类型字段的能力,需同时满足数据库、表结构、查询写法和模型配置四层条件——缺一不可,否则静默失效。
必须确认的底层前提
所有高级功能都依赖 MySQL 原生 JSON 函数,不是配置文件开关能开启的:
- MySQL 版本 ≥ 5.7.0(推荐 8.0+),执行
SELECT VERSION();验证 - 目标字段类型必须是 JSON,不是 TEXT/VARCHAR,执行
SHOW COLUMNS FROM table_name LIKE 'field_name';查看 Type 列 - 字段值本身需为合法 JSON(可用
SELECT JSON_VALID(field_name) FROM table;检查)
Db 类操作 JSON 字段的关键写法
不依赖模型时,用 json() 方法显式声明字段,否则一律当字符串处理:
- 写入:必须带
->json(['info']),再传 PHP 数组,框架自动json_encode - 查询整字段:
Db::name('user')->json(['info'])->find(1)→$user['info']是数组 - 查嵌套值:
where('info->>email', 'a@b.com')(注意 ->>,不是->或.) - 多级路径:
where('info->>profile.name', 'Tom')或where('info->>"$.profile.name"', 'Tom')
模型中让 JSON 字段真正“自动转换”的双配置
仅靠数据库字段类型或单配 $type 不行,必须成对设置:
-
protected $json = ['info'];→ 告诉框架该字段要走 JSON 编解码流程 -
protected $type = ['info' => 'json'];→ 控制读取时调用json_decode,且影响toArray() - 字段名大小写、下划线必须与数据库列名完全一致(如数据库是
user_info,就不能写userInfo) - 赋值时直接给数组:
$model->info = ['email' => 'a@b.com'];,别手动json_encode
高频易错点与避坑提示
这些细节不处理,查询会静默失败或返回空结果:
-
where('info->email', 'a@b.com')错误:返回带引号字符串"a@b.com",PHP 中与裸字符串比较恒为 false -
whereJsonContains('tags', 'php')危险:第二个参数必须是 JSON 字符串,应写成json_encode('php') - 字段值为
NULL时,$model->info是null,不是空数组,需自行判断:is_array($v) ? $v : [] - 键名含短横线(如
en-US)不能用->en-US,要用->{'en-US'}或转数组后下标访问
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











