回答

收藏

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

技术问答 技术问答 307 人阅读 | 0 人回复 | 2023-09-14

我正在尝试为博客文章生成一个存档列表。存档列表应按相反的时间顺序显示年份和日期,如下所示:
7 \( o5 S2 E- ~. C$ z3 c5 `2013 (21)
* X0 g7 E1 K, I1 C& R: O    - May (2)- m( C. v2 I; W2 u  J; D
    - April (3)
4 r9 B; h! [; a3 E    - March (5)
% u0 k2 u! ]; Y3 ~( ~' M, X/ C    - February (1)0 w( Z: ^& g5 E
    - January (10)
3 ?+ M9 g; f% g) `( u5 E4 \' N2012 (10)
3 ~& F. p- O6 i  F" m) ~    - December (6)
, Z6 F/ b3 C- D2 c" L    - November (4)/ ]$ Y" G& B  M  X
里面()的数字是该时间段内的帖子数。选择年份或月份后,仅应显示该选定时间段内的博客文章。
5 P- h9 F( I3 D1 W! \' [* l, S7 q到目前为止,我只能通过执行以下操作来找出每篇博客文章的年份和月份:+ P: s$ s- D& f* m9 g% B- W
$posts = Post::all();' J0 F: }/ J! k0 G, b( f8 w
$archive = array();% S+ A: s  u3 o, |
foreach ($posts as $post) {( r2 t3 |) {& K. q+ |
    $year = date('Y', strtotime($post->created_at));
( n) M9 b- Q  b! S    $month = date('m', strtotime($post->created_at));" ^0 L" _$ S6 b5 Z% w- g
}/ v( d! B. ]; _/ ^/ @- a* J# J
我如何实现上述目标?
( P. u) w9 _6 E. h               
. O8 P/ J! p8 P$ _! Z4 p$ j9 B解决方案:; z7 E; n6 d: ~( V5 C( `4 B, i
                & s8 o# K# @1 ]+ N7 }( B6 |
3 z! L# k# ~# d

0 F6 D; p( G6 Q3 D                为了在某??种导航面板中生成链接,您可以在数据库端进行大部分处理,而不用这样的查询来获取所有博客文章记录
7 s. X+ ^7 u5 ^0 DSELECT YEAR(created_at) year,1 T8 h6 D3 ~. ]3 F- W! J: l
       MONTH(created_at) month,+ r6 B% x+ L) w) Q8 Q' {& R
       MONTHNAME(created_at) month_name,
  [( b% \* i$ i( e& \       COUNT(*) post_count
9 u2 Z' A# E1 j8 B8 j* D1 c3 A" {  FROM post
" M2 q7 F- r: F. \* o GROUP BY year, MONTH(created_at)" _, G% y) i6 f; r: o
ORDER BY year DESC, month DESC;
% y# O' @  v) z6 t- D9 T输出:
7 }: Z8 n- \4 A1 b* G| YEAR | MONTH | MONTH_NAME | POST_COUNT |1 Q" a7 e, R; Z% H" ?& @; t" }) j) l/ c
------------------------------------------
0 J0 s* z: g- A8 [- m. ?! T) `| 2013 |     5 |        May |          5 |
: V3 r/ M3 o" r" ]6 M) g; \7 h| 2013 |     4 |      April |          3 |6 k- U' j) R  D) N! {
| 2013 |     3 |      March |          4 |
8 w6 c- W& _3 j1 d- T2 ?: ~| 2013 |     2 |   February |          3 |- @3 j/ a) [& `# |* Z: y) F
| 2013 |     1 |    January |          2 |1 o% \, C! ]9 S1 S- Q0 m; S$ M. K
| 2012 |    12 |   December |          2 |
. Y% U7 f+ P- P- b| 2012 |    11 |   November |          3 |
( w5 A# x5 `" [4 e; t9 Q我不是laravel的专家,但是应该使用类似的方法来实现
+ O8 s) m1 b3 Z/ ?$links = DB::table('post')
5 U" s; p/ ?0 [! y2 K6 m. {& W    ->select(DB::raw('YEAR(created_at) year, MONTH(created_at) month, MONTHNAME(created_at) month_name, COUNT(*) post_count'))
, ^* S. S, T+ }    ->groupBy('year')5 U2 i4 k. g) A- y+ N7 i
    ->groupBy('month')& p2 g% a# }3 r( ^) y9 i' E( k
    ->orderBy('year', 'desc')
5 k; d: a$ S5 p1 c2 N1 Z4 s& Z5 |    ->orderBy('month', 'desc'); ]& b! m0 [% M: |5 P
    ->get();
2 [: d& T" w0 |! S如果需要,您可以像这样将小计添加到年行中; d4 z' E/ l. N) B) E% b
SELECT YEAR(created_at) year,. M$ u8 a# s7 J  ?6 \
       MONTH(created_at) month,
7 t% a( D1 Q9 c1 n/ C4 d       MONTHNAME(created_at) month_name,5 Q8 b1 |' ]  V
       COUNT(*) post_count% W; m# X6 e3 D# c
  FROM post
) y  `* _* c& q" i  ?( M0 A9 L! h GROUP BY year, MONTH(created_at); L+ Z  L# a; Z9 @: o9 ^9 U$ R
UNION ALL
0 B: h! z. n0 S. P9 j: z+ cSELECT YEAR(created_at) year,
3 R3 [7 U( y3 I# k' r; o. O       13 month,
/ \. p3 p2 d5 e9 v: t& e       NULL month_name,
: q& w, z* v3 t- R/ {  {2 _       COUNT(*) post_count
& Z! U" K  j0 B3 i" E  FROM post
  v" \7 |0 u' ]8 z7 J! y# @ GROUP BY year4 D# F# K' V0 t6 k0 q2 G. r
ORDER BY year DESC, month DESC;
( v, z% k- U% ?. p2 O- y输出:0 ]0 G" {* r3 K- e' Y
| YEAR | MONTH | MONTH_NAME | POST_COUNT |
  S: \5 B. e; k- q" ~% o- w6 p------------------------------------------0 c# C- Y8 ]& K' F* B0 I
| 2013 |    13 |     (null) |         17 |5 ?) ?6 i, u. E& ^
| 2013 |     5 |        May |          5 |7 R: f0 a2 A/ Y
| 2013 |     4 |      April |          3 |
' C7 A8 f: X( \+ C| 2013 |     3 |      March |          4 |$ e8 C: u% n0 d1 X! d
| 2013 |     2 |   February |          3 |7 u: Z+ c2 B  L
| 2013 |     1 |    January |          2 |+ G) N0 v: N0 Z5 [7 \
| 2012 |    13 |     (null) |          5 |+ V# ~1 g  j2 o3 }
| 2012 |    12 |   December |          2 |
6 q- |- W' ?3 \" X; [| 2012 |    11 |   November |          3 |
8 b! v; V, u3 eSQLFiddle
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则