Laravel中如何用Collection按月份分组日期字符串?报错求助
按月份分组日期的正确实现方法
你的错误根源很明确:在map函数里,你把created_at转成了字符串格式的月份(比如"Oct"),然后试图在这个字符串上调用groupBy()方法——字符串根本没有这个方法,所以才会报Call to a member function groupBy() on string的错误。
下面是两种正确的实现方式:
方法一:先处理字段再分组
先给每条数据添加上月份字段,再按这个字段分组,适合需要保留原数据其他信息的场景:
$user = Auth::user()->id; $products = productSold::where('user_id', $user)->get(); $groupedProducts = $products->map(function ($product) { return [ 'month' => date('M', strtotime($product->created_at)), 'product_info' => $product // 保留你需要的原数据字段 ]; })->groupBy('month'); return $groupedProducts;
方法二:直接在groupBy中处理日期(更简洁)
不需要先做map,直接在groupBy的闭包里生成月份作为分组键:
$user = Auth::user()->id; $groupedProducts = productSold::where('user_id', $user) ->get() ->groupBy(function ($product) { return date('M', strtotime($product->created_at)); }); return $groupedProducts;
额外需求:只获取每个月份的数量
如果不需要保留原数据,只需要每个月份的记录数,可以在分组后再处理:
$monthlyCounts = $groupedProducts->map(function ($items) { return $items->count(); }); return $monthlyCounts;
这样得到的结果会是类似:
[ "Oct" => 2, "Nov" => 1, "Dec" => 23 ]
内容的提问来源于stack exchange,提问作者Ray Paras
相关产品推荐
相关产品推荐

