Laravel Carbon Group按月计算

时间:2017-01-05 11:04:26

标签: php mysql laravel laravel-5 eloquent

谁能看到我做错了什么?

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

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

我得到以下回复

{"month":null}

在我的数据库中,我有五篇新闻文章都创建于2017年1月5日,所以我只得到一个回复​​,但我没有得到月份的数量?

6 个答案:

答案 0 :(得分:6)

您可以使用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');
 });

答案 1 :(得分:2)

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

您没有获取需要分组的任何其他数据,您只想拥有不同月份的列表,因此请使用distinct。

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

另外,看看Alexey提供的解决方案,您需要从数据库中获取整个数据集,这对于您正在尝试执行的操作非常低效。 distinct()查询将比select *快得多,并将结果分组为PHP。

编辑:

这里的小注释,你将null作为值返回的原因是因为你在MONTH()函数中使用了一个字符串而不是实际的字段。

答案 2 :(得分:0)

您可以简单地使用groupby和mysql MONTH。

$months = NewsItem::groupby(\DB::raw('MONTH(created_at) as month'))->get();

答案 3 :(得分:0)

您可以这样做:

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

答案 4 :(得分:0)

要按月获得收入,您可以尝试以下代码:-

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

答案 5 :(得分:0)

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