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

JSON_AGG聚合函数返回结果去除括号与引号的问题求解

问题根因

  1. PostgreSQL的JSON_AGG函数返回结果为JSON格式字符串,而非数组类型,Laravel Eloquent默认不会自动解析该字段,因此返回响应时该字段会被二次JSON编码,导致外层多一层引号、内部引号被转义。
  2. 前端接收到数据时,dosage_list是字符串类型而非数组,执行数组相关操作(遍历、取长度等)时就会抛出Cannot use 'in' operator to search for 'length'的类型错误。
  3. 直接用str_replace、preg_replace处理查询结果的逻辑错误:get()返回的是Laravel集合对象而非纯字符串,直接执行字符串操作会报错,就算强行转字符串处理也会破坏整体JSON结构。

解决方法

方法1:模型中配置字段类型转换(最推荐)

直接在HmsBbrKnowledgebaseDrug模型中添加$casts属性,指定dosage_list为数组类型,Laravel会自动完成JSON编解码,无需手动处理:

// 在HmsBbrKnowledgebaseDrug模型文件中添加以下代码
protected $casts = [
    'dosage_list' => 'array',
];

配置完成后原有查询逻辑无需修改,返回的dosage_list会自动转为正常JSON数组,无多余引号和转义。

方法2:查询后手动解码字段

如果不想修改模型,可在拿到查询结果后遍历手动解码dosage_list字段:

public function fetchdrug(Request $search_drug){
    $filter_drug = $search_drug->input('search_drug');
    $all_drugs = HmsBbrKnowledgebaseDrug::selectRaw('DISTINCT ON (drug_code)
                                                    drug_code,
                                                    drug_name,
                                                    JSON_AGG(drug_dosage) AS dosage_list')
                                ->groupBy('drug_code', 'drug_name')
                                ->orderBy('drug_code', 'ASC')
                                ->get();

    // 遍历解码每个条目的dosage_list字段
    foreach ($all_drugs as $drugItem) {
        $drugItem->dosage_list = json_decode($drugItem->dosage_list, true);
    }

    return response()->json([
        'all_drugs' => $all_drugs,
    ]);
}

内容的提问来源于stack exchange,提问作者user16409170

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 04:36:04