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属性定义即可。
<?php namespace app\index\model; use think\Model; class User extends Model { // 设置json类型字段 protected $json = ['info']; }
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字段的属性类型,就会自动进行相应类型的参数绑定查询。
<?php namespace app\index\model; use think\Model; class User extends Model { // 设置json类型字段 protected $json = ['info']; // 设置JSON字段的类型 protected $jsonType = [ 'user_id'=>'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字段类型的使用(ORM)的详细内容。更多信息请关注PHP中文网其他相关文章!

本文讨论了ThinkPHP的内置测试框架,突出了其关键功能(例如单元和集成测试),以及它如何通过早期的错误检测和改进的代码质量来增强应用程序可靠性。

本文讨论了在无服务器体系结构中使用ThinkPHP的关键注意事项,专注于性能优化,无状态设计和安全性。它突出了诸如成本效率和可扩展性之类的收益,但也应对挑战

本文讨论了在ThinkPHP微服务中实施服务发现和负载平衡,重点是设置,最佳实践,集成方法和推荐工具。[159个字符]

ThinkPHP的IOC容器提供了高级功能,例如懒惰加载,上下文绑定和方法注入PHP App中有效依赖性管理的方法。Character计数:159

ThinkPHP具有轻巧的设计,MVC架构和可扩展性。它通过各种功能提高可扩展性,加快开发并提高安全性。

本文概述了使用ThinkPhp和RabbitMQ构建分布式任务队列系统,重点是安装,配置,任务管理和可扩展性。关键问题包括确保高可用性,避免常见的陷阱,例如不当


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具

Dreamweaver Mac版
视觉化网页开发工具

禅工作室 13.0.1
功能强大的PHP集成开发环境

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

SublimeText3汉化版
中文版,非常好用