Lab / Laravel

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 который расскладывает месяца как ячейки в сетке, а записи как блоки внутри этих ячеек.