问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

thinkphp 怎么接收json数据

发布网友 发布时间:2022-04-07 09:01

我来回答

2个回答

懂视网 时间:2022-04-07 13:22

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 appindexmodel;
use thinkModel;
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 appindexmodel;
use thinkModel;
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

热心网友 时间:2022-04-07 10:30

$this->ajaxReturn();就是返回JSON的数据格式。 你JQUERY 那边,要改进下, success:function(data){ if(data.status == 1){ alert('上传成功'); }else{ alert('上传失败'); }}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
急求高人解答 ···管理类的问题 ···!!!急急急···我会在线等... ...如果基层管理幅度为8,高层管理人员管理幅度为3,则该公司中层管理人员... ...发生化学变化的实质是( )A.分子间隔发生变化B.物质状态发生改变C... 下列变化不能说明发生了化学变化的是( )A.变化时有电子的得失或共用电... 下列描述正确的是( )A.固态物质的分子间无间隔B.液态物质的分子不断运动... 原来微信打开这个功能,能够看到马路上的街景,涨知识了! ...百度帐号被人在异地登录了,问题是没有任何人知道我的密码啊?而且也... 医疗事故纠纷和医疗损害纠纷的区别是什么 医疗纠纷与医疗事故的定义是什么? 医疗事故纠纷是指什么的 中年少妇款女装最大最旺的批发巿场在哪里? 加入北约没有加入欧盟的国家? 土耳其1952年就加入了北约,但为什么到现在都不能加入欧盟? 乌克兰为什么一直不能加入北约和欧盟 土耳其很早就加入了北约,为何却没有加入欧盟? 是欧盟成员国但不是北约成员国的有哪些 瑞士为什么不加入北约和欧盟? 冷战期间欧洲哪个国家既没有参加华约也没有参加北约 欧洲有哪6个国家既没有参加北约也没有加入华约? 目前不是北约成员国的欧洲国家 零基础学服装设计怎么样,可以吗? 欧洲内不加入北约的有哪些国家 我一个男的想学裁缝可以吗?总觉得不是男的该干的活,学习先要从那个方面入手? 欧洲有哪几个国家既没有参加北约也没有加入华约? wow学裁缝有前途吗? 中欧西欧北欧南欧的国家中,哪些没有加入北约? 裁缝当今吃香吗?学了裁缝,发现只能去工厂里,累,工资低, 哪些国家没有加入欧盟与北约 现在学裁缝快两个月了,感觉累,好像没前途,学厨师怎么样 欧盟中有哪些国家没有加入北约 请问有沼气地带,禁止通行之类的提示语啊? 蚕丝的衣服可以漂白吗 沼气的危害? 桑蚕丝服装发黄可用双氧水漂白吗 沼气的危害是什么? 男子吸入沼气昏迷,沼气对人体的危害有多大? 新买桑蚕丝衣服可以用盐水泡洗吗 请问农村沼气需要办理危险化学品安全许可吗 沼气安全生产制度电子版 垃圾发酵产生沼气是否要领危险化学品生产许可证 沼气工程的日常管理 漂白水把蚕丝衣服漂黄了怎么用什么方法可以洗白了 如何预防沼气中毒,预防沼气中毒的安全措施 什么是沼气中毒? 沼气会爆炸? 有没有定每日计划的APP? 有哪些简单便捷的清单计划应用app推荐? 求推荐一款可以用日常计划和安排并定时提醒的app。 狮跑按键 帮解释下具体功能吧 起亚狮跑的四驱锁,必须在车停止的状态下使用吗?