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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 18:35:22