工作中有时候会用到json来保存数据,而MySQL5.7之前是不支持json类型字段的。因为json_encode后的中文是unicode编码类型的,直接用中文去搜索是没办法匹配的。所以我们需要把搜索的字段转为unicode编码,再去模糊搜索就可以了。
代码如下:
//把需要匹配的字段用json_encode转义,并去掉转义后的字符串带的双引号
$params = str_replace('"','',json_encode($params));
//把转义后的unicode编码数据中的“\”替换成“_”
$params = str_replace("\\",'_',$params);
TP框架自定义查询:
/**
* 自定义查询表
* @param $params
* @return array
*/
public function getList($params)
{
$page = !empty($params['page']) ? $params['page'] : 1;
$limit = !empty($params['limit']) ? $params['limit'] : 10;
$where = [];
$backData = [
'total' => 0,
'list' => [],
];
if ($params['status'] >= 0) {
$where['status'] = $params['status'];
}
$tableName = $params['table'];
$createTime = !empty($params['create_time']) ? $params['create_time'] : 0;
$updateTime = !empty($params['update_time']) ? strtotime(date('Y-m-d 23:59:59', $params['update_time'])) : time();
$where['create_time'] = [['>=', $createTime], ['<=', $updateTime]];
if (!empty($params['push_data'])) {
//因数据库版本原因,只能采取该方式查询json数据
if (is_numeric($params['data'])) {
$data = $params['data'];
} else {
//去除json_encode转义的后字符串带的双引号
$data = str_replace('"', '', json_encode($params['data']));
//把转义后的unicode编码数据中的“\”替换成“_”
$data = str_replace("\\", '_', $data);
}
$where['data'] = ['LIKE', "%$data%"];
}
$total = $this->name("$tableName")->where($where)->count();
if ($total > 0) {
$backData['total'] = $total;
$list = $this->name("$tableName")->field('*')
->where($where)->page($page, $limit)->order('id DESC')->select();
if ($list) {
$backData['list'] = $list;
}
}
return $backData;
}