You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从数据库存储的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:51:04