Отображение уникальных месяцев и лет сообщений + фильтрация их - Laravel 5.2

У меня есть простая система блогов, в которой я хочу показать архив на боковой панели, который показывает все месяцы и годы сообщений в блогах. Сообщения в блогах имеют значение Created_at и updated_at в базе данных в следующем формате: 2016-04-20 12:05:10 Но когда я делаю это:

<ul>
@foreach($blogposts as $post)
  <li class="bow-item"> <a href="#">{{$post->created_at->format('F Y')}}</a> </li>
@endforeach
</ul>

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

Обновление: вы можете сделать что-то вроде этого

$dates = DB::table('blogposts')
    ->distinct()
    ->orderBy('created_at')
    ->get([
        DB::raw('YEAR(`created_at`) AS `year`'),
        DB::raw('MONTH(`created_at`) AS `month`'),
    ]);

Проблема в том, что при таком подходе мои значения сохраняются как целое число. Но я хотел бы отформатировать дату.


person Christophvh    schedule 22.04.2016    source источник


Ответы (3)


Я знаю, что вы можете запустить весь необработанный запрос:

$query = "
    SELECT
        created_at
    FROM blogposts
    GROUP BY YEAR(created_at) DESC, MONTH(created_at) DESC
";
$dates = DB::select($query);

Или это может работать (не проверено и может не работать):

$dates = DB::table('blogposts')
    ->select('created_at')
    ->orderBy(DB::raw('YEAR(created_at) DESC, MONTH(created_at) DESC')
    ->get();
person Ixalmida    schedule 22.04.2016

Возможно, вы могли бы использовать что-то вроде этого:

$periods = DB::table('blogposts')
    ->select(DB::raw('YEAR(created_at) year, MONTH(created_at) month, MONTHNAME(created_at) month_name)
    ->groupBy('year')
    ->groupBy('month')
    ->orderBy('year', 'desc')
    ->orderBy('month', 'desc')
    ->get();

Затем выводите так:

<ul>
    @foreach($periods as $period)
    <li class="bow-item"> <a href="#">{{$period->year}} - {{$period->month_name}}</a></li>
    @endforeach
</ul>
person ioMatrix    schedule 22.04.2016

Это работает для меня.

Запрос:

$dates = DB::table('blogposts')
     ->select(DB::raw('YEAR(created_at) year, MONTH(created_at) month, MONTHNAME(created_at) month_name'))
     ->distinct()
     ->orderBy('year', 'desc')
     ->orderBy('month', 'desc')
     ->get();

Вывод:

@foreach($dates as $date) 
    {{ $date->month_name }}, {{ $date->year }} <br>
@endforeach
person Ryan Claxton    schedule 28.04.2021