Laravel: группировка записей по месяцам
Разрабатывая на одном из сайтов расписание семинаров столкнулся с вопросом вывода "плиток" семинаров сгруппированных по месяцу. Следуя золотому правилу - искал что то в гугле - пиши заметку, публикую здесь моё решение.
Для начала в нашем контроллере подключаем модель в которой у меня хранятся события, а так же класс 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 который расскладывает месяца как ячейки в сетке, а записи как блоки внутри этих ячеек.