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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 15:27:16