Laravel Group Query Result by Day/Month/Year

Quick tip for those who want to list some events, grouping them by some date value – by day, month, year etc.

Let’s take a look at example – we have this database structure of appointments.

And we want to list the upcoming appointments for 7 days ahead, grouped by day. Like this:

Ok, so here’s the code:

$days = Appointment::whereBetween('start_time', [now(), now()->addDays(7)])
    ->orderBy('start_time')
    ->get()
    ->groupBy(function ($val) {
        return Carbon::parse($val->start_time)->format('d');
    });

foreach ($days as $day => $appointments) {
    echo '<h2>'.$day.'</h2><ul>';
    foreach ($appointments as $appointment) {
        echo '<li>'.$appointment->start_time.'</li>';
    }
    echo '</ul>';
}

A few explanations here:

  1. The main “trick”: you can use Collection result to groupBy any custom logic you want – see groupBy(function ($val) { …
  2. Inside of that groupBy we still need to use Carbon::parse(), even if start_time column is within $dates array of the model.
  3. Use now() helper to manipulate some dates

That’s it! You can read more about available Collection grouping/manipulating methods in the official documentation, or purchase my course “Eloquent: Expert Level”, where I dedicated one of the sections to Collections, see below:

Like our articles?
Check out our Laravel online courses!

3 COMMENTS

  1. I wish you had black friday on your courses, they are bit high for an african man for 19 dollars its two months meal hey… wish to purcharse eloquent course of yours seem to have great features I am looking for

    • I will give you the same gift we’re giving to our QuickAdminPanel customers.
      Use this code to unlock all courses with 100% discount: QUICKADMINPANEL2019

      Hope this helps in your learning journey.

LEAVE A REPLY

Please enter your comment!
Please enter your name here