工作中有時候會用到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;
}