谁能看到我做错了什么?
我正在尝试输出所有月份,但将它们分组以便它们是唯一的。
$months = NewsItem::select(DB::raw('MONTH("created_at") as month'))->groupBy('month')->get();
return $months;
我得到以下回复
{"month":null}
在我的数据库中,我有五篇新闻文章都创建于2017年1月5日,所以我只得到一个回复,但我没有得到月份的数量?
答案 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();