Get*_*elp 5 sql controller function aggregate-functions laravel
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();
return response()->json([
'all_drugs'=>$all_drugs,
]);
}
Run Code Online (Sandbox Code Playgroud)
我正在使用JSON_AGG检索多行drug_dosage并将它们合并为一行,但是我的输出中出现了括号和引号,我该如何将其取出?
更新:我在示例中遇到错误,因为我正在尝试使用str_replace和 的解决方案preg_replace。我的问题是目标在 SQL 语句中,所以我怀疑这与错误有关,因为结果错误中还有其他数据:
Uncaught TypeError: Cannot use 'in' operator to search for 'length' in
{"drug_code":"CFZU",
"drug_name":"Cefazolin",
"dosage_list":"[\"<=4 mg\/L\", \"<=3 mg\/L\"]"},
{"drug_code":"TZPD","drug_name":"Pip\/Tazobactam",
"dosage_list":"[\"Pip\/Tazobactam\"]"}
Run Code Online (Sandbox Code Playgroud)
小智 0
因为:JSON_AGG返回JSON ARRAY为STRING。之后,您从控制器返回json 编码结果。这会添加不需要的字符以使 json 编码有效。(嵌套引号必须转义)。
所以;
在发送结果之前,您必须对每条记录的 drug_dosage 字段进行 json_decode 。
示例代码:
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,
string_agg(drug_dosage, ', ') AS dosage_list')
->GroupBy('drug_code', 'drug_name')
->orderBy('drug_code', 'ASC')
->get();
foreach($all_drugs as $drug){
//decode postgresql 'json array like string presentation' to array.
$decoded = json_decode($drug->drug_dosage);
// if you want to remove null/empty values use array_filter
$filtered = array_filter($decoded); // default behavior removes falsy values.
// use same field to hold wanted, structured values
$drug->drug_dosage = $filtered;
}
// And return as json response like before.
return response()->json([
'all_drugs'=>$all_drugs,
]);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
109 次 |
| 最近记录: |