如何使用Laravel Map函数处理数据对象和数组,调整输出格式满足需求
修改后可直接运行的代码
// 预先定义月份数字到名称的映射 $monthNames = [ 1 => 'January', 2 => 'February', 3 => 'March', 4 => 'April', 5 => 'May', 6 => 'June', 7 => 'July', 8 => 'August', 9 => 'September', 10 => 'October', 11 => 'November', 12 => 'December' ]; $loans = Loan::select('date_release') ->where('invalid',false) ->where('transaction_year', $transyear) ->get() ->groupBy(function($date) { return Carbon::parse($date->date_release)->format('m'); // 按月份分组 }); $loanmcount = []; $loanArr = []; foreach ($loans as $key => $value) { $loanmcount[(int)$key] = count($value); } // 重构$loanArr生成逻辑,解决关联数组转JSON为对象的问题 for($i = 1; $i <= 12; $i++){ $monthCount = $loanmcount[$i] ?? 0; // 直接生成符合要求的二维索引数组,每个子元素为[月份名, 数值] $loanArr[] = [ $monthNames[$i], // 如需转小数/百分比格式可在此处做转换,比如(float)$monthCount $monthCount ]; } $loanTypeCount = Loan::select(['loan_type AS name', DB::raw('count(loan_type) AS y')]) ->groupBy('loan_type') ->orderBy(DB::raw('y'), 'desc') ->where('transaction_year', $transyear) ->where('invalid', false) ->get(); $loanTypeCount->map(function($loan)use($loanArr) { $loan->data = $loanArr; return $loan; });
可选优化:按贷款类型单独统计月度数据
如果需要不同贷款类型返回各自对应的月度统计(而非所有类型共用全量贷款月度数据),将上述map逻辑替换为以下代码即可:
$loanTypeCount->map(function($loan) use ($transyear, $monthNames) { // 单独查询当前贷款类型的月度发放数据 $typeLoans = Loan::select('date_release') ->where('invalid', false) ->where('transaction_year', $transyear) ->where('loan_type', $loan->name) ->get() ->groupBy(fn($date) => Carbon::parse($date->date_release)->format('m')); $typeMcount = []; foreach ($typeLoans as $key => $value) { $typeMcount[(int)$key] = count($value); } $typeData = []; for($i = 1; $i <= 12; $i++){ $typeData[] = [ $monthNames[$i], $typeMcount[$i] ?? 0 ]; } $loan->data = $typeData; return $loan; });
内容的提问来源于stack exchange,提问作者Eli
相关产品推荐
相关产品推荐

