Laravel中foreach遍历数据存入变量仅返回单条结果如何解决
问题原因
循环内每次都对$data执行全量赋值操作,每轮遍历都会覆盖上一轮存储的内容,遍历完成后自然只会保留最后一条记录的拼接结果。
修复方法
方法1:修正字符串拼接逻辑
如果需要保留字符串拼接的实现方式,把循环内的全量赋值改为追加赋值,最后处理掉末尾多余的逗号即可,修正后的代码如下:
$countUser = DB::table('users') ->select(DB::raw('roles.name AS name, count(users.id) AS countUser')) ->join('role_user', 'users.id', '=', 'role_user.user_id') ->join('roles', 'role_user.role_id', '=', 'roles.id') ->groupByRaw('role_user.role_id, roles.name') ->get(); // 初始化空字符串 $data = ""; foreach($countUser as $user){ // 用 .= 执行字符串追加,而非直接 = 覆盖 $data .= "['".$user->name."', ".$user->countUser."],"; } // 移除末尾多余的逗号,避免前端JS语法报错 $data = rtrim($data, ','); dd($data);
方法2:使用集合映射(推荐)
手动拼接字符串容易出现引号转义、格式错误问题,更推荐直接用Laravel集合的map方法生成结构化数组,传给前端时直接转JSON即可,适配ECharts、Chart.js等绝大多数饼图组件:
$countUser = DB::table('users') ->select(DB::raw('roles.name AS name, count(users.id) AS countUser')) ->join('role_user', 'users.id', '=', 'role_user.user_id') ->join('roles', 'role_user.role_id', '=', 'roles.id') ->groupByRaw('role_user.role_id, roles.name') ->get(); // 直接映射为饼图需要的二维数组结构 $pieData = $countUser->map(function ($item) { return [$item->name, $item->countUser]; })->toArray(); // 前端渲染时直接输出JSON即可,视图中用法示例: // <script>const chartData = {!! json_encode($pieData) !!};</script> dd($pieData);
注意:分组时建议同时指定role_id和roles.name,避免不同ID的角色重名时统计错误,同时兼容MySQL严格模式下的GROUP BY语法校验规则。
内容的提问来源于stack exchange,提问作者baihaqi
相关产品推荐
相关产品推荐

