Laravel Carbon按月分组

7

有没有人能看出我做错了什么?

我正在尝试输出所有月份,但是将它们分组,使它们唯一。

$months = NewsItem::select(DB::raw('MONTH("created_at") as month'))->groupBy('month')->get();
return $months;

我得到了以下的回复。
{"month":null}

在我的数据库中,有五篇新闻文章,所有文章都是在05/01/2017创建的,所以只得到一条响应是正确的,但我没有获得月份的数字?

6个回答

22

你可以使用带有闭包的groupBy()方法:

 $months = NewsItem::groupBy(function($d) {
     return Carbon::parse($d->created_at)->format('m');
 })->get();

或者先获取数据,然后在Eloquent集合上使用groupBy()

 $months = NewsItem::get()->groupBy(function($d) {
     return Carbon::parse($d->created_at)->format('m');
 });

7
你好,这个错误是因为 strtolower() 函数预期参数1是字符串,但实际给定的是一个对象。 - user7747472
你必须使用第二种方法。首先获取数据,然后进行分组。 - Alisanie

3

为什么在您的用例中需要使用group by子句?

如果您不需要获取任何其他需要使用group by的数据,只是想要一个不同月份的列表,请使用distinct。

$months = NewsItem::selectRaw("MONTH(created_at) as month")->distinct()->get();

此外,看一下Alexey提供的解决方案,你需要从数据库中获取整个数据集,这非常低效,考虑到你要做的事情。一个distinct()查询比select *更快,并在PHP中对结果进行分组。
编辑:
小提示:你得到null作为返回值的原因是因为你在MONTH()函数中使用了一个字符串而不是实际字段。

1
您可以简单地使用 groupby 和 mysql MONTH。
$months = NewsItem::groupby(\DB::raw('MONTH(created_at) as month'))->get();

1
你可以这样做:

NewsItem::get(["*",\DB::raw('MONTH(created_at) as month')])->groupBy('month');

0
$month = NewsItem::select(
DB::raw('DATE_FORMAT(created_at, "%M") as month'))
->groupBy('month')
->get();

0

如果想要每月获得收益,可以尝试以下代码:

$getMonthlyReport = OrderMaster::select(DB::raw("sum(order_total_amt) as        earnings,date_format(order_date, '%Y-%m') as YearMonth"))
    ->groupBy('order_date')
    ->get();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接