Tp5操作mysql json函数
官方文档介绍
JSON字段
从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);
dump($user);
查询条件为JSON数据
$user = Db::name('user')
->json(['info'])
->where('info->nickname','ThinkPHP')
->find();
dump($user);
由于JSON字段的属性类型并不会自动获取,所以,如果是整型数据查询的话,可以设置JSON字段类型,例如:
$user = Db::name('user')
->json(['info'])
->where('info->user_id', 10)
->setJsonFieldType(['info->user_id' => 'int'])
->find();
dump($user);
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数据更新没什么问题,但是某些情况可能一次修改多个,但是也不想全部替换 怎么处理?
注意 :在源码中 项目\thinkphp\library\think\db\builder.php@parseData方法中 修改
源代码:
修改后:
### 自定义多个修改
if($name == 'Cjson'){
if(is_array($val) && !empty($val)){
$f_sql = 'json_set(' . $item;
foreach ($val as $fk=>$fv){
$f_sql.= ', \'$.' . $fk . '\', ' . $this->parseDataBind($query, $key, $fv, $bind);
}
$result[$item] = $f_sql . ")";
}
}else{
$result[$item] = 'json_set(' . $item . ', \'$.' . $name . '\', ' . $this->parseDataBind($query, $key, $val, $bind) . ')';
}
### end
控制器调用:
- 单个修改:
$edit_['json_str->email'] = 22;
- 多个修改:
$edit_['text_str->Cjson'] = ['name'=>'lisi_'.time(),'customer'=>118];