当前位置:

首页 > 编程开发 > ThinkPHPJSON数据怎么存_ThinkPHP模型JSON字段介绍【教程】

ThinkPHPJSON数据怎么存_ThinkPHP模型JSON字段介绍【教程】

ThinkPHP存储JSON数据应使用MySQL5.7+的JSON字段类型,配合模型中的json()方法或$json属性自动处理数组编码与解码。查询时需确保字段已声明为JSON类型,并可使用->语法。缓存JSON数据应直接存储json_encode()后的字符串,避免使用serialize()。注意JSON字段不支持全文索引和LIKE模糊查询,相关需求需冗余

ThinkPHP 存 JSON 数据应使用 MySQL 5.7+ 的 JSON 字段类型配合 json(['info']) 方法写入数组,确保支持 info->email 查询;模型中配置 $json = ['info'] 可自动解码;缓存时直接存 json_encode() 字符串,勿用 serialize()。

ThinkPHPJSON数据怎么存_ThinkPHP模型JSON字段介绍【教程】

在 ThinkPHP 中处理 JSON 数据,核心问题往往不在于“能不能存”,而在于“用什么方式存、在哪存、怎么查”。选择不当,后续按字段查询、类型保持、缓存读取都可能出问题,甚至直接导致 SQL 执行失败。

MySQL 5.7+ 必须用 JSON 字段类型 + json() 方法

如果你的数据库是 MySQL 5.7 或更高版本,并且表结构已经将 info 字段明确定义为 JSON 类型(而非 TEXT),那么就别再手动进行 json_encode() 然后插入了。ThinkPHP 6+ 提供的 json() 方法,其价值在于能自动触发数据库的原生 JSON 函数,这样写入更安全,后续的查询功能才能真正派上用场。

  • 写入时直接传数组:Db::name('user')->json(['info'])->insert(['name' => '张三', 'info' => ['email' => 'zhang@example.com', 'tags' => ['php', 'tp6']]])
  • 如果漏掉了 json() 调用,即使字段是 JSON 类型,ThinkPHP 也会将其当作普通字符串处理,直接后果就是后续的 -> 查询语法完全失效。
  • 字段名必须显式地列在 json() 方法的参数里,例如 json(['info', 'config'])。漏写任何一个,那个字段在本次操作中就会退化为纯文本处理。

where('field->key', $value) 查询前必须确认字段已声明为 JSON

想用 info->email 这种语法来查询数据?光在写入时调用 json() 方法可不够,数据库字段本身必须是 JSON 类型。否则,MySQL 会直接报出 Invalid JSON text 错误,或者干脆返回空结果。

  • 错误示范:Db::name('user')->where('info->email', 'zhang@example.com')->find() —— 如果 info 字段是 TEXT 类型,这条查询会静默失败,什么也查不到。
  • 正确做法:建表时使用 info JSON 定义字段,写入时使用 json(['info']) 方法,查询时才能顺畅地使用 -> 语法。
  • 对于 JSON 内部的整数型值(比如 info->uid),数据库默认会将其作为字符串进行比对。这时需要显式指定字段类型:setFieldType(['info->uid' => 'int']),否则像 where('info->uid', 1001) 这样的查询很可能匹配不到数据。

模型里用 $json = ['info'] 比手动调 json() 更省心

如果你需要频繁操作某个 JSON 字段,那么在模型层进行统一配置,远比每次手动调用 json(['info']) 要可靠得多,并且还能自动处理数据读取时的解码。

立即学习“PHP免费学习笔记(深入)”;

  • 在模型类中加入:protected $json = ['info'];。之后,所有通过 find()、select() 等方法获取到的 info 字段值,都会自动是 PHP 数组(效果等同于 json_decode($str, true))。
  • 更新整个 JSON 字段:$user->info = ['email' => 'new@ex.com']; $user->sa ve(); —— ThinkPHP 会自动识别并调用 JSON_SET 等原生函数。
  • 只更新 JSON 内部的某个键:$user->sa ve(['info->nickname' => 'Tinywan'], ['id' => 1]);。这里需要注意,info->nickname 是作为一个整体字段名来处理的,并非嵌套赋值语法。

缓存 JSON 数据别碰 serialize(),直接存字符串

ThinkPHP 的缓存机制确实依赖 serialize() 来处理对象,但 JSON 数据本身并不是对象——它本质上是字符串。用 serialize() 再包装一层纯属浪费 CPU 资源,还可能因为序列化精度问题导致浮点数变形,或者把 null 值变成空数组。

  • 正确姿势:cache('user_info_123', $json_string, 3600)。这里的 $json_string 直接就是 json_encode($data) 得到的结果字符串。
  • 错误姿势:cache('user_info_123', serialize($json_string), 3600)。取出来时,你不得不先 unserialize() 再 json_decode(),完全是多此一举。
  • 使用 APCu 或 Redis 等缓存驱动前,建议先校验:json_last_error() === JSON_ERROR_NONE,避免将无效的 JSON 字符串当作有效数据缓存进去。

最后,还有一个最容易被忽略的关键点:MySQL 的 JSON 字段不支持全文索引,也无法在 WHERE 子句中对 JSON 内部的字段使用 LIKE 进行模糊查询。如果确实有这类需求,必须提前将关键字段冗余到普通的表列中,或者考虑引入 Elasticsearch 这类搜索引擎作为补充方案。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
编程开发 JSON
相关文章 更多
Java发送post请求发送json数据的实现方法与代码示例
Java发送post请求发送json数据的实现方法与代码示例

深入解析Java发送JSON格式POST请求的实现机制,对比原生API与第三方库的代码差异,提供可复制的代码示例,并探讨超时设置、编码处理及微服务场景下的例外情况。

抖音官网入口网页
抖音官网入口网页

抖音官网入口的正确打开方式 如果你在寻找抖音网页版的入口,那么直接访问 https://www.douyin.com 就是了。这不仅是通往海量短视频世界的门户,更是一个功能越来越专业的媒体素材库和创作工具箱。为什么这么说?看看它最近在功能上的深度拓展就知道了。 简单一个网址背后,其实是一个日益精密的

在小说搜搜找不到想看的小说怎么办?小说搜搜换源功能使用详解【必学】
在小说搜搜找不到想看的小说怎么办?小说搜搜换源功能使用详解【必学】

小说搜搜搜索不到结果?五种实用解决方法帮你搞定 在小说搜搜里搜不到想看的书?这事儿其实挺常见。问题多半出在书源上——要么是默认的书源还没来得及收录,要么是原先的源数据失效了,更新没跟上。别急,下面这五条解决路径,基本能覆盖绝大多数情况,操作起来也不复杂。 一、通过阅读页调出换源入口手动切换 这个方法

蓝海搜书搜书攻略及入口指南免费分享
蓝海搜书搜书攻略及入口指南免费分享

蓝海搜书提供超三百万部小说资源,覆盖十余类题材;具备毫秒级搜索响应、四套主题引擎、跨端加密同步及全文索引等核心功能,入口为lanhaizw.com。 关于蓝海搜书的免费资源入口和核心功能,一直是许多读者关注的焦点。今天,我们就来深入拆解一下这个平台,看看它在资源、体验和功能上究竟有哪些门道。 官方入

Java中JSONassert,JsonUnit和Jackson三方比对
Java中JSONassert,JsonUnit和Jackson三方比对

断言工具专为测试场景设计,支持宽松模式并精准定位差异;单元工具基于断言工具和杰克逊库封装,提供更友好的断言接口;杰克逊库作为主流处理库,可通过节点树模型自定义比对逻辑,适用于业务开发中精细控制差异的场景。

百度编辑器从Json对象中取值,完成初次渲染,在编辑器内画表格
百度编辑器从Json对象中取值,完成初次渲染,在编辑器内画表格

通过AJAX异步请求服务器获取JSON格式的表格数据,解析JSON对象后遍历数据条目,动态拼接成包含表格标签的HTML字符串,最后调用编辑器实例的setContent()方法将HTML写入编辑器,完成表格在编辑器内的初次渲染。

1024编程
1024编程

面向8-18岁青少年,采用计算机硕士以上师资,以Scratch、Python、C++、CSP-J/S和NOIP五个阶段系统化循序渐进推进,避免冗余理论,注重实战,紧密对标竞赛与升学需求,形成高效衔接、直通信息学奥赛的课程体系,着力培养计算思维,助力学生冲刺升学。

能编程与会编程
能编程与会编程

能编程与会编程的区别在于前者仅是技术实现,后者包含情绪管理、坚持探索、主动负责、追求完善及知识体系构建等综合能力。编程之外的能力决定了解决问题的深度与广度。

c++如何解析GeoJSON中的FeatureCollection地理要素集【实战】
c++如何解析GeoJSON中的FeatureCollection地理要素集【实战】

使用nlohmann/json库解析GeoJSONFeatureCollection,需逐层防御性访问features、geometry和properties,坐标数组维度不确定,需判断。坐标系和精度问题在解析层无法解决,应暴露原始坐标数组供上层处理。性能敏感时避免重复解析和深拷贝,可缓存并视口裁剪。

Pandas如何解析JSON数据为表_利用json_normalize函数扁平化数据
Pandas如何解析JSON数据为表_利用json_normalize函数扁平化数据

pandas.json_normalize 这个函数,说起来挺有意思的——很多人以为它能一键把嵌套 JSON 拍扁成表格,结果往往发现列名变成了一串带点的“火车”(比如 profile.address.city),真正棘手的问题却一个都没解决。字段缺失怎么办?列表嵌套怎么炸开?多层结构怎么拆?答案其

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

PDF教程
PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
Adobe Acrobat Pro macOS版
Adobe Acrobat Pro macOS版
Mac

Adobe Acrobat Pro 是面向办公、法务、财务、教育及出版用户的专业PDF处理软件,可在Mac上创建、编辑、转换、合并和保护文档,并提供OCR文字识别、表单、批注、内容比较、敏感信息遮盖及电子签名功能。

Blender
Blender
Windows、macOS 和 Linux

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

Shapr3D macOS版
Shapr3D macOS版
Mac

Shapr3D是一款面向工业设计、机械工程、建筑概念和三维打印工作流的CAD软件。Mac版采用Parasolid建模内核,支持草图约束、实体建模、工程图、可视化渲染及常见CAD格式交换,并可通过账户在多台设备之间同步项目。

WINDOWS 更多
AutoCAD Windows版
AutoCAD Windows版
Windows

AutoCAD 是 Autodesk 推出的专业计算机辅助设计软件,Windows 版支持精确二维绘图、三维实体与曲面建模、图纸标注、布局发布和任务自动化,并包含多套行业专业化工具组合,适用于建筑、机械、电气、工程建设及制造设计人员。

Adobe Acrobat Pro Windows版
Adobe Acrobat Pro Windows版
Windows

Adobe Acrobat Pro 是面向专业 PDF 工作的综合解决方案,可在 Windows 中创建、编辑、转换、比较、整理和保护文档,并支持表单、电子签名、扫描件文字识别及敏感信息永久遮盖。订阅还包含网页、移动服务和云端协作能力,

Blender
Blender
Windows、macOS 和 Linux

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。