技术饭
thinkphp5.1的json数据写入、查询
正常一篇文章属于一个分类,所以是单选,现在需要将一篇文章对应多个分类,这时候就需要将分类的单选改成了多选,那做法就有两种,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字符串。
2、写入catid为json格式,这里直接手动转换,没有使用官方文档的方式,且需要将json的键修改成唯一,值转成字符串形式(便于json查询,不需要类型转换)。
3、组装catid的json键进行查询,如:catid>value_1、catid>value_2
以下是官方文档给出的数据库操作方式: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);
文明上网理性发言!
json的多条件查询怎么写?