2016-04-22 10 views
0

私はサイドバーに月間&年のblogpostsを示すアーカイブを表示する単純なブログシステムを持っています。ブログ記事には、この形式では、データベース内のcreated_at & updated_atの値を持っている:2016-04-20 12:05:10しかし、私はこれを行うとき:投稿数が一意である月と年を表示+フィルタする - Laravel 5.2

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

ブログ記事が&年同月持っている場合、私は明らかに繰り返される値を取得します。どのようにしてユニークな月を得るのですか&年+その月または年に基づいてソートして複数の投稿を得ることができますか?私は一意の値を取得するため、私はおそらく私は結果をフィルタリングするときに唯一の投稿を取得します。

更新: あなたは問題が私の値は、このアプローチには整数として保存されていることである。この

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

ような何かを行うことができます。しかし、私は日付をフォーマットしたいと思います。

答えて

1

私はあなたが全体の生のクエリを実行でき知っている:

$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(); 
1

おそらく、あなたはこのようなものを使用することができます:

$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>