thinkphp josn mysql_ThinkPHP:JSON字段类型的使用(ORM)

5a22ad92901c1e524745567c55ebcc7a.png

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/534945.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

获取http地址如何从上面抓取图片_用 Python 自动抓取妹子图

目录前言Media Pipeline启用Media Pipeline使用 ImgPipeline抓取妹子图瞎比比与送书后话前言我们在抓取数据的过程中&#xff0c;除了要抓取文本数据之外&#xff0c;当然也会有抓取图片的需求。那我们的 scrapy 能爬取图片吗&#xff1f;答案是&#xff0c;当然的。说来惭愧&a…

MySQL摘要_mysql摘要

2011-04-15(1)mysqld关闭命令&#xff1a;mysqladmin -u root shutdown。注意&#xff1a;windows命令以enter结束不是;&#xff0c;mysql命令行才是(2)mysql终端接入&#xff0c;修改mysql.user表内容&#xff0c;添加授权用户。insert into mysql.user(Host,User,Password,ss…

错误代码0x800f0950怎么解决_解决win10安装net framework 3.5失败(错误代码 0x800F0950)...

视频教程&#xff1a;Win10教程 安装net framework 3.5失败(错误代码 0x800F0950)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com一&#xff1a;出现问题&#xff1a;报错代码二&#xff1a;解决步骤1.通过命令提示符明确自己系统版本Windows键X ,打开&#xff08;命…

java mysql dump_Java 调用Mysql dump 备份数据库

SimpleDateFormat sdf new SimpleDateFormat("yyyyMMddHHmmss");try {String name sdf.format(new Date());String filePath System.getProperty("user.dir") "//" name ".sql";// 系统执行器Runtime rt Runtime.getRuntime();…

python 日志不会按照日期分割_django实现日志按日期分割

settings文件中配置&#xff1a; LOGGING { version:1, disable_existing_logger:False, formatters:{ verbose:{ format:%(asctime)s \"%(pathname)s&#xff1a;%(module)s:%(funcName)s:%(lineno)d\" [%(levelname)s]-%(message)s }, }, # 处理器 handlers:{ # 输…

mysql事务隔离最高_Mysql事务隔离级别

mysql官方文档显示&#xff1a;InnoDB中每个隔离级别的详细描述如下&#xff1a; READ UNCOMMITTEDSELECT语句以非锁定方式被执行&#xff0c;但是一个可能更早期版本的记录会被用到。因此&#xff0c;使用这个隔离级别&#xff0c;比如&#xff0c;读是不连贯的。着也被称为“…

exe打包工具哪个最好_一键分发工具哪个最好用?这款30万人都在用,很优秀!...

现代化媒体对于传播越来越重要&#xff0c;16年到如今&#xff0c;视频内容产业实在有话题度&#xff0c;其高效的粉丝互动机制、低资金投入高额回报等等亮点&#xff0c;强烈吸引着数以百万计的创造者&#xff0c;为了达到极其出色的阅读量&#xff0c;这些人往往会运用到所有…

mysql备份服务器中的_使用 Shell 备份远程服务器上的 MySQL 数据库到本机

适用场景&#xff1a;远程服务器上的 MySQL 不允许远程访问&#xff0c;此时我们需要先登录服务器&#xff0c;备份数据库后&#xff0c;将备份文件拉取到本机。源码 mysqlDumpRemote2Local.sh#!/bin/bash################################################# TODO: 登录远程服务…

date转timestamp格式_技术分享 | MySQL:timestamp 时区转换导致 CPU %sy 高的问题

作者&#xff1a;高鹏文章末尾有他著作的《深入理解 MySQL 主从原理 32 讲》&#xff0c;深入透彻理解 MySQL 主从&#xff0c;GTID 相关技术知识。本文为学习记录&#xff0c;可能有误请谅解。本文建议PC端观看&#xff0c;效果更佳。这个问题是一个朋友遇到的风云&#xff0c…

mysql架构组成_第 2 章 MySQL 架构组成

麻雀虽小&#xff0c;五脏俱全。MySQL 虽然以简单著称&#xff0c;但其内部结构并不简单。本章从MySQL物理组成、逻辑组成&#xff0c;以及相关工具几个角度来介绍 MySQL 的整体架构组成&#xff0c;希望能够让读者对 MySQL 有一个更全面深入的了解。2&#xff0e;1 MySQL物理文…

python列表生成器语法_python列表生产式和生成器

1.列表生成式&#xff1a;通过简洁的语法可以对一组元素进行过滤 格式&#xff1a;[exp for val in collection if condition] 例子1&#xff1a; a [x*xforxinxrange(1,10)ifx%20] print(a) 1&#xff09;append()&#xff1a; 该方法用于在列表末尾添加新的对象&#xff0c;…

win2008 mysql端口_使用自定义端口连接SQL Server 2008的方法

使用过SQL Server的人大多都知道&#xff0c;SQL Server服务器默认监听的端口号是1433&#xff0c;但是我今天遇到的问题是我的机器上有三个数据库实例&#xff0c;这样使用TCP/IP远程连接时就产生了问题。如何在Microsoft SQL Server Management Studio里加入端口号连接呢&…

python基本命令range_Python的Range()函数(指南)

当需要执行特定次数的操作时&#xff0c;Python内置的range函数十分方便。 读罢本文&#xff0c;你将&#xff1a; 理解Python的range函数是如何工作的 了解Python 2和Python 3中的实现方式有何不同 看过了不少range()函数操作实例 有能力解决它的一些局限性 让我们开始吧&…

天涯python_python 網絡爬蟲(一)爬取天涯論壇評論

我是一個大二的學生&#xff0c;也是剛接觸python&#xff0c;接觸了爬蟲感覺爬蟲很有趣就爬了爬天涯論壇&#xff0c;中途碰到了很多問題&#xff0c;就想把這些問題分享出來&#xff0c;都是些簡單的問題&#xff0c;希望大佬們以寬容的眼光來看一個小菜鳥&#x1f604;&…

python快递费用计算_[Python]简单用Python写个查询快递的程序最后附源代码

[Python] 纯文本查看 复制代码from requests_html import HTMLSession session HTMLSession() def sb(dh): 用来识别快递 返回快递种类! url http://www.kuaidi100.com/autonumber/autoComNum?resultv21&text dh header { Referer: http://www.kuaidi100.com/, User-A…

qos的_QoS 概述

QoS 是一个很大的领域&#xff0c;涉及到网络中的多个层次和环节。本文仅简要的谈谈 Endpoint 侧的 QoS 概念&#xff0c;将这些纷繁的概念名词串起来&#xff0c;便于理解。QoS 技术背景下图说明了 QoS workflow 中&#xff0c;各项技术的位置和关系摘自 &amp;lt; 端到端Q…