Laravel: группировка записей по месяцам

Разрабатывая на одном из сайтов расписание семинаров столкнулся с вопросом вывода "плиток" семинаров сгруппированных по месяцу. Следуя золотому правилу - искал что то в гугле - пиши заметку, публикую здесь моё решение.

events.png

Для начала в нашем контроллере подключаем модель в которой у меня хранятся события, а так же класс Carbon для манипуляций с датами.

use App\Event;
use Carbon\Carbon;
Примечание: даты в базе должны хранится в корректном формате, а именно year-month-day для того, что бы мы могли получить необходимый нам месяц в качестве аргумента для группировки.

В методе контроллера который у меня отвечает за вывод событий пишем вот такую конструкцию:

public function events(){
    $events = Event::orderBy('date_start') // это поле в БД для сортировки
                    ->get()
                    ->groupBy(function($events) {
                        return Carbon::parse($events->date_start)->format('m'); // А это то-же поле по нему мы и будем группировать
                    });
    return view('events')->with('events', $events);
}

Как вы видите мы получили данные из модели Event отсортировали все записи по дате, и описали небольшую функцию группировки, где при помощи класса Carbon получили месяц из даты вида 2017-02-01 в качестве аргумента для группировки записей. Теперь в переменной $events у нас получился многомерный массив, где в качестве ключа выступает месяц.

Осталось лишь вывести всю эту красоту в представлении:

<div class="row">
  @foreach($events as $key => $value)
      <div class="col-sm-3">
          <h3>{{$key}}</h3>
          @foreach($value as $event)
            <div class="event-item">
               <p>{{$event->title}}</p>
            </div>
          @endforeach
      </div>
  @endforeach
</div>

Как вы наверное уже догадались по классам разметки, за стилизацию у меня отвечает bootstrap который расскладывает месяца как ячейки в сетке, а записи как блоки внутри этих ячеек.