JSON_AGG聚合函数返回结果去除括号与引号的问题求解
问题根因
- PostgreSQL的
JSON_AGG函数返回结果为JSON格式字符串,而非数组类型,Laravel Eloquent默认不会自动解析该字段,因此返回响应时该字段会被二次JSON编码,导致外层多一层引号、内部引号被转义。 - 前端接收到数据时,
dosage_list是字符串类型而非数组,执行数组相关操作(遍历、取长度等)时就会抛出Cannot use 'in' operator to search for 'length'的类型错误。 - 直接用
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
相关产品推荐
相关产品推荐

