在Laravel中为博客生成存档列表

SUB*_*0DH 7 php sql laravel

我正在尝试为博客文章生成存档列表.存档列表应按反向时间顺序显示年份和日期,如下所示:

2013 (21)
    - May (2)
    - April (3)
    - March (5)
    - February (1)
    - January (10)
2012 (10)
    - December (6)
    - November (4)
Run Code Online (Sandbox Code Playgroud)

里面()的数字是该时间段内的帖子数量.选择一年中的年份或月份时,只应显示该选定时间段内的博客帖子.

到目前为止,我只能通过以下方式找出每篇博文的年份和月份:

$posts = Post::all();
$archive = array();
foreach ($posts as $post) {
    $year = date('Y', strtotime($post->created_at));
    $month = date('m', strtotime($post->created_at));
}
Run Code Online (Sandbox Code Playgroud)

我如何实现上述目标?

pet*_*erm 15

为了在某​​种导航面板中生成链接,您可以在数据库端执行大部分处理,而不是使用像这样的查询获取所有博客帖子记录

SELECT YEAR(created_at) year,
       MONTH(created_at) month,
       MONTHNAME(created_at) month_name,
       COUNT(*) post_count
  FROM post
 GROUP BY year, MONTH(created_at)
 ORDER BY year DESC, month DESC;
Run Code Online (Sandbox Code Playgroud)

输出:

| YEAR | MONTH | MONTH_NAME | POST_COUNT |
------------------------------------------
| 2013 |     5 |        May |          5 |
| 2013 |     4 |      April |          3 |
| 2013 |     3 |      March |          4 |
| 2013 |     2 |   February |          3 |
| 2013 |     1 |    January |          2 |
| 2012 |    12 |   December |          2 |
| 2012 |    11 |   November |          3 |
Run Code Online (Sandbox Code Playgroud)

我不是laravel的专家,但它应该用类似的东西来实现

$links = DB::table('post')
    ->select(DB::raw('YEAR(created_at) year, MONTH(created_at) month, MONTHNAME(created_at) month_name, COUNT(*) post_count'))
    ->groupBy('year')
    ->groupBy('month')
    ->orderBy('year', 'desc')
    ->orderBy('month', 'desc')
    ->get();
Run Code Online (Sandbox Code Playgroud)

如果需要,可以将小计添加到这样的年份行

SELECT YEAR(created_at) year,
       MONTH(created_at) month,
       MONTHNAME(created_at) month_name,
       COUNT(*) post_count
  FROM post
 GROUP BY year, MONTH(created_at)
UNION ALL
SELECT YEAR(created_at) year,
       13 month,
       NULL month_name,
       COUNT(*) post_count
  FROM post
 GROUP BY year
 ORDER BY year DESC, month DESC;
Run Code Online (Sandbox Code Playgroud)

输出:

| YEAR | MONTH | MONTH_NAME | POST_COUNT |
------------------------------------------
| 2013 |    13 |     (null) |         17 |
| 2013 |     5 |        May |          5 |
| 2013 |     4 |      April |          3 |
| 2013 |     3 |      March |          4 |
| 2013 |     2 |   February |          3 |
| 2013 |     1 |    January |          2 |
| 2012 |    13 |     (null) |          5 |
| 2012 |    12 |   December |          2 |
| 2012 |    11 |   November |          3 |
Run Code Online (Sandbox Code Playgroud)

SQLFiddle


Jac*_*ade 15

这种方法最优雅的方法是将闭包传递给groupBy()集合方法.

$posts_by_date = Post::all()->groupBy(function($date) {
    return Carbon::parse($date->created_at)->format('Y-m');
});
Run Code Online (Sandbox Code Playgroud)

然后,您可以在刀片模板中循环浏览它,类似于:

@foreach ($posts_by_date as $date => $posts)
    <h2>{{ $date }}</h2>
    @foreach ($posts as $post)
        <h3>{{ $post->title }}</h3>
        {{ $post->content }}
    @endforeach
@endforeach
Run Code Online (Sandbox Code Playgroud)