Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel Carbon Group by Month

Can anyone see what I'm doing wrong?

I'm trying to output all the months but group them so they are unique.

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

I'm getting the following back

{"month":null}

In my database I have five news articles all created_at 05/01/2017 so it's right that I only get one response but I'm not getting the number of the month back?

like image 459
Dev.W Avatar asked Jan 05 '17 11:01

Dev.W


2 Answers

You can use groupBy() method with closure:

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

Or get data first and then use groupBy() on the Eloquent collection:

 $months = NewsItem::get()->groupBy(function($d) {
     return Carbon::parse($d->created_at)->format('m');
 });
like image 109
Alexey Mezenin Avatar answered Sep 28 '22 20:09

Alexey Mezenin


Why do you need the group by clause in your usecase?

You are not fetching any additional data for which a group by is required, you just want to have a list of distinct months, so use distinct.

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

Also looking at the solution provided by Alexey, you'll need to fetch the entire dataset from the DB, which is highly inefficient looking at what you are trying to do. A distinct() query would be much faster than a select * and group the results in PHP.

Edit:

Little sidenote here, the reason you get null returned as value is because you use a string in the MONTH() function instead of the actual field.

like image 32
Robert Avatar answered Sep 28 '22 19:09

Robert