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://blog.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来源请求【方案】