Laravel 8中Foreach循环仅返回SQL查询最后一条结果问题求助
问题原因
你的foreach循环中,每次都用$data = ...直接赋值,这会覆盖掉上一次循环的结果,最终$data只保留最后一条记录的内容。
解决方案
方法1:使用字符串追加运算符.=
把赋值语句改成追加模式,每次循环将新内容拼接到已有字符串后面:
public function piechart(){ $result = DB::select(DB::raw("select count(class_id) as citizen_count,citizen_classes.name from assign_citizens LEFT JOIN citizen_classes ON assign_citizens.class_id = citizen_classes.id GROUP BY citizen_classes.id")); $data = ""; foreach ($result as $val){ // 用 .= 代替 =,实现内容追加 $data .= "['".addslashes($val->name)."', ".$val->citizen_count."],"; } // 移除最后多余的逗号(可选,Google Charts通常兼容,但更规范) $chartData = rtrim($data, ','); return view('backend.graphs.pie_chart',compact('chartData')); }
方法2:用数组存储再拼接(更推荐)
先将每条数据存入数组,最后用implode拼接,这种方式更清晰,也能避免手动拼接的错误:
public function piechart(){ $result = DB::select(DB::raw("select count(class_id) as citizen_count,citizen_classes.name from assign_citizens LEFT JOIN citizen_classes ON assign_citizens.class_id = citizen_classes.id GROUP BY citizen_classes.id")); $chartDataArray = []; foreach ($result as $val){ // 转义名称中的特殊字符,避免破坏JS语法 $escapedName = addslashes($val->name); $chartDataArray[] = "['{$escapedName}', {$val->citizen_count}]"; } // 用逗号拼接所有元素 $chartData = implode(',', $chartDataArray); return view('backend.graphs.pie_chart',compact('chartData')); }
额外提示
如果类别名称中包含单引号、反斜杠等特殊字符,直接拼接会导致JS语法错误,所以用addslashes()或者Laravel的e()函数转义是很有必要的。
内容的提问来源于stack exchange,提问作者Jahir Antúnez Antonio
相关产品推荐
相关产品推荐

