技术饭

thinkphp5.1的json数据写入、查询

copylian    1 评论    20988 浏览    2020.03.03

正常一篇文章属于一个分类,所以是单选,现在需要将一篇文章对应多个分类,这时候就需要将分类的单选改成了多选,那做法就有两种,1、将文章表的catid字段改成json格式,如:{"value":"5","value":"6"},2、删除文章表的catid字段,新建一个关联catid的表。

根据需求,基于减少修改数据表且tp5.1可以json查询这两点,就选择了json形式来完成这个需求。

官方给出来的json查询也只支持一维数组,如:{"name":"aaa","user":"bbb","sex":"ccc"},然后通过条件:info>name查询到,多维数组:[{"name":"aaa","user":"bbb","sex":"ccc"},{"name":"aaa","user":"bbb","sex":"ccc"}}] 并不支持,所以就只能找一个折中的办法了。

1、原始catid的int类型,改成varchat字符串。

1583214502.png

2、写入catid为json格式,这里直接手动转换,没有使用官方文档的方式,且需要将json的键修改成唯一,值转成字符串形式(便于json查询,不需要类型转换)。

1583214605(1).png

1583214538(1).png

3、组装catid的json键进行查询,如:catid>value_1、catid>value_2

1583214838(1).png

以下是官方文档给出的数据库操作方式:https://www.kancloud.cn/manual/thinkphp5_1/507620

从V5.1.4+版本开始,强化了JSON字段的操作支持。如果你的user表有一个info字段是JSON类型的(或者说你存储的是JSON格式,但并非是要JSON字段类型),你可以使用下面的方式操作数据。

JSON数据写入

$user['name'] = 'thinkphp';

$user['info'] = [

             'email'    => 'thinkphp@qq.com',

            'nickname' => '流年'

];

Db::name('user')->json(['info'])->insert($user);

JSON数据查询

查询整个JSON数据:

$user = Db::name('user')->json(['info'])->find(1);

查询条件为JSON数据:

$user = Db::name('user')->json(['info'])->where('info->nickname','ThinkPHP')->find();

由于JSON字段的属性类型并不会自动获取,所以,如果是整型数据查询的话,可以设置JSON字段类型,例如:

$user = Db::name('user')->json(['info'])->where('info->user_id', 10)->setJsonFieldType(['info->user_id' => 'int'])->find();    

JSON数据更新

完整JSON数据更新

$data['info'] = [

            'email'    => 'kancloud@qq.com',

            'nickname' => 'kancloud'

];

Db::name('user')->json(['info'])->where('id',1)->update($data);

单个JSON数据更新

$data['info->nickname'] = 'ThinkPHP';

Db::name('user')->json(['info'])->where('id',1)->update($data);

只袄早~~~
感谢你的支持,我会继续努力!
扫码打赏,感谢您的支持!

文明上网理性发言!