我正在尝试为博客文章生成存档列表.存档列表应按反向时间顺序显示年份和日期,如下所示:
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)
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)
归档时间: |
|
查看次数: |
6301 次 |
最近记录: |