如何从数据库存储的JSON字段提取值并整合到result_array()?
如何从数据库JSON字段提取键值并存入查询结果
你现在遇到的问题是数据库里的kepribadian字段存的是JSON字符串,直接查询出来没法用键值访问对吧?其实只需要把这个JSON字符串转成PHP数组就行,给你两种简单的实现方式:
方案一:在Model中处理查询结果
修改你Model里的filter_hasil_mbti方法,在返回结果前遍历每一行数据,把kepribadian字段用json_decode转成关联数组:
public function filter_hasil_mbti($search, $limit, $start, $order_field, $order_ascdesc) { $sql = $this->db->select('a.id AS id, a.refid AS refid, CONCAT(b.firstname," ",b.lastname) AS fullname, a.kepribadian AS kepribadian, a.jam_mulai AS jam_mulai, a.jam_selesai AS jam_selesai, a.percentage AS percentage') ->from('jawaban_mbti as a') ->join('registrasi_baru as b', 'a.refid=b.refid', 'left') ->like('a.refid', $search) ->or_like('b.firstname', $search) ->or_like('b.lastname', $search) ->or_like('a.kepribadian', $search) ->or_like('a.jam_mulai', $search) ->or_like('a.jam_selesai', $search) ->order_by($order_field, $order_ascdesc) ->limit($limit, $start) ->get()->result_array(); // 遍历结果,将JSON字符串转成关联数组 foreach ($sql as &$row) { // 第二个参数true表示转成关联数组,方便用下标访问 $decoded = json_decode($row['kepribadian'], true); // 处理JSON解码失败的情况,避免返回null $row['kepribadian'] = $decoded ?? []; } return $sql; }
这样返回的$sql数组里,每个元素的kepribadian都是可以直接用键值访问的数组了,比如$row['kepribadian']['Introversion']就能拿到对应的百分比。
方案二:在Controller中处理数据
如果你不想修改Model,也可以在Controller拿到查询结果后再处理:
public function ajax_jawaban_mbti() { $search = $_POST['search']['value']; $limit = $_POST['length']; $start = $_POST['start']; $order_index = $_POST['order'][0]['column']; $order_field = $_POST['columns'][$order_index]['data']; $order_ascdesc = $_POST['order'][0]['dir']; $sql_total = $this->mhasil->count_all_Soal('jawaban_mbti'); $sql_data = $this->mhasil->filter_hasil_mbti($search, $limit, $start, $order_field, $order_ascdesc); // 在这里处理JSON字段 foreach ($sql_data as &$item) { $decoded = json_decode($item['kepribadian'], true); $item['kepribadian'] = $decoded ?? []; } $sql_filter = $this->mhasil->count_filter_hasil_mbti($search); $callback = array( 'draw' => $_POST['draw'], 'recordsTotal' => $sql_total, 'recordsFiltered' => $sql_filter, 'data' => $sql_data, ); echo json_encode($callback); }
小提示
json_decode的第二个参数设为true会把JSON转成PHP关联数组,如果你想用对象访问(比如$row->kepribadian->Introversion),可以去掉这个参数,或者设为false。- 加上
?? []是为了防止JSON格式错误导致解码失败返回null,这样能保证代码更健壮,不会因为脏数据报错。
内容的提问来源于stack exchange,提问作者ravhirzldi
相关产品推荐
相关产品推荐

