ThinkPHP:JSON字段类型的使用(ORM)
发布时间 - 2019-12-16 00:00:00 点击率:次ThinkPHP5.1版本正式发布已经有一段时间了,我会陆续给大家介绍其中的新特性。今天要给大家介绍的是一个可能很多用户还不了解的一个特性:JSON字段数据支持。
不过首先注意一点,本篇内容中描述的JSON字段数据的支持是从V5.1.4+版本引入的。由于包含安全更新的原因,建议确保使用5.1.9+版本。本篇中对JSON字段的定义包括JSON类型或者保存的数据为JSON格式的字符类型,所以理论上除了使用JSON字段条件查询外,对数据库类型和版本没有要求。
Db类操作JSON
如果你没有使用模型类,Db类提供了一个json方法可以指定你的数据表JSON格式字段。例如你的user表有一个info字段是JSON类型的,你可以使用下面的方式操作数据。
数据写入
$user['name'] = 'thinkphp';
$user['info'] = [
'email' => 'thinkphp@qq.com',
'nickname' => '流年',
];
Db::name('user')
->json(['info'])
->insert($user);json方法的参数是一个数组,示例中指定了info字段,其实可以指定多个JSON类型字段。
数据查询
查询整个JSON数据使用。
$user = Db::name('user')
->json(['info'])
->find(1);
dump($user);返回的查询结果数据中,会自动包含一个数组类型的info数据,也就是说JSON格式数据已经自动json_decode处理。
该方式查询对info字段并非严格要求使用JSON类型
如果需要根据JSON数据的值进行查询,可以使用下面的方法
$user = Db::name('user')
->json(['info'])
->where('info->nickname','ThinkPHP')
->find();
dump($user);要求info字段必须是JSON类型,MySQL需要5.7+版本才能支持
当然,也可以支持多级
$user = Db::name('user')
->json(['info'])
->where('info->profile->nickname','ThinkPHP')
->find();
dump($user);由于JSON字段的属性类型并不会自动获取,所以,如果是整型数据查询的话,需要手动参数绑定,例如:
$user = Db::name('user')
->json(['info'])
->where('info->user_id', ':user_id')
->bind(['user_id' => [10, \PDO::PARAM_INT]])
->find();
dump($user);数据更新
完整JSON数据更新
$data['info'] = [
'email' => 'kancloud@qq.com',
'nickname' => 'kancloud',
];
Db::name('user')
->json(['info'])
->where('id',1)
->update($data);该方式查询对info字段并非严格要求使用JSON类型
如果只是更新JSON数据中的某个值,则可以使用下面的方法:
$data['info->nickname'] = 'ThinkPHP';
Db::name('user')
->json(['info'])
->where('id',1)
->update($data);同样要求info字段必须是JSON类型
模型操作JSON数据
如果你使用的是模型操作数据库的话,那么JSON数据操作就更简单了。
我们只要给User模型类增加一个json属性定义即可。
json属性同样支持定义多个字段名称,定义后,可以进行如下JSON数据操作。
写入数据
使用数组方式写入JSON数据:
$user = new User; $user->name = 'thinkphp'; $user->info = [ 'email' => 'thinkphp@qq.com', 'nickname '=> '流年', ]; $user->save();使用对象方式写入JSON数据
$user = new User; $user->name = 'thinkphp'; $info = new StdClass(); $info->email = 'thinkphp@qq.com'; $info->nickname = '流年'; $user->info = $info; $user->save();查询数据
和Db类查询出来的结果类型不同,模型的JSON字段会自动转换成对象方式。
$user = User::get(1); echo $user->name; // thinkphp echo $user->info->email; // thinkphp@qq.com echo $user->info->nickname; // 流年同样也可以支持查询JSON字段数据
$user = User::where('info->nickname','流年')->find(); echo $user->name; // thinkphp echo $user->info->email; // thinkphp@qq.com echo $user->info->nickname; // 流年和Db类查询一样,如果你需要查询的JSON属性是整型类型的话,需要进行手动参数绑定。
$user = User::where('info->user_id',':user_id') ->bind(['user_id' => [10 ,\PDO::PARAM_INT]]) ->find(); echo $user->name; // thinkphp echo $user->info->email; // thinkphp@qq.com echo $user->info->nickname; // 流年如果你使用的是V5.1.11+版本的话,可以在模型类里面定义JSON字段的属性类型,就会自动进行相应类型的参数绑定查询。
'int' ]; }没有定义类型的属性默认为字符串类型,因此字符串类型的属性可以无需定义。
更新数据
更新JSON数据也是采用对象的方式
$user = User::get(1); $user->name = 'kancloud'; $user->info->email = 'kancloud@qq.com'; $user->info->nickname = 'kancloud'; $user->save();如果你需要对JSON类型字段做更复杂的操作,还可以通过exp表达式方式完成。这个就等待大家去发现更多的JSON用法了。
PHP中文网,有大量免费的ThinkPHP入门教程,欢迎大家学习!
本文转自:https://b
log.thinkphp.cn/784281
# thinkphp # json # php # mysql # 整型 # 字符串 # 字符串类型 # 对象 # 数据库 # https # 如果你 # 的是 # 绑定 # 多个 # 要给 # 是一个 # 数据查询 # 就会 # 我会
相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571 】
相关推荐: Laravel如何构建RESTful API_Laravel标准化API接口开发指南 Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程 利用python获取某年中每个月的第一天和最后一天 网站制作大概多少钱一个,做一个平台网站大概多少钱? Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】 Laravel怎么生成URL_Laravel路由命名与URL生成函数详解 Laravel怎么判断请求类型_Laravel Request isMethod用法 如何在万网自助建站平台快速创建网站? 使用豆包 AI 辅助进行简单网页 HTML 结构设计 如何快速生成高效建站系统源代码? laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法 如何在阿里云香港服务器快速搭建网站? EditPlus中的正则表达式 实战(1) 简单实现Android验证码 Python结构化数据采集_字段抽取解析【教程】 米侠浏览器网页背景异常怎么办 米侠显示修复 Laravel如何处理异常和错误?(Handler示例) Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程 今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】 Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】 小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像 Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】 武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的? 原生JS实现图片轮播切换效果 Laravel怎么在Blade中安全地输出原始HTML内容 如何在局域网内绑定自建网站域名? Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】 打造顶配客厅影院,这份100寸电视推荐名单请查收 Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】 如何快速查询网站的真实建站时间? 如何在阿里云虚拟服务器快速搭建网站? Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】 香港服务器建站指南:外贸独立站搭建与跨境电商配置流程 黑客如何通过漏洞一步步攻陷网站服务器? Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验 谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程 香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南 微信小程序 wx.uploadFile无法上传解决办法 如何快速搭建高效WAP手机网站吸引移动用户? java中使用zxing批量生成二维码立牌 高端建站如何打造兼具美学与转化的品牌官网? Python企业级消息系统教程_KafkaRabbitMQ高并发应用 nginx修改上传文件大小限制的方法 如何快速辨别茅台真假?关键步骤解析 如何在橙子建站中快速调整背景颜色? JavaScript如何实现倒计时_时间函数如何精确控制 中国移动官方网站首页入口 中国移动官网网页登录 Laravel如何使用Livewire构建动态组件?(入门代码) laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程 Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】


log.thinkphp.cn/784281