【问题标题】:Laravel/Eloquent: Making archive list for posts (year, month)Laravel/Eloquent:为帖子制作归档列表(年、月)
【发布时间】:2020-02-08 08:33:11
【问题描述】:

我正在尝试为博客创建存档列表。我想要这样的东西:

2020

  • 一月 (3)
  • 二月 (2)

2019

  • 一月 (10)
  • 2 月(23 日)

到目前为止,我已经设法将帖子整理到一个显示计数的数组中,但是该数组每个月都单独作为一个数组。我希望它被嵌套,以便年份是父数组,然后每个月都是嵌套的。

$posts_by_date = $blog->hasMany(Post::class)
  ->where('status', 'published')
  ->selectRaw('year(created_at) year, month(created_at) month, count(*) count')
  ->groupBy('year', 'month')
  ->orderByRaw('created_at') desc')
  ->get()
  ->toArray();

有没有办法让组通过嵌套而不是分开?我知道我可以在之后修改结果,我只是认为如果我直接从查询中获取它会更干净。

【问题讨论】:

  • 如果您要将所有这些转换为一个数组并使用selectRaw,为什么不执行 SQL 查询呢?对于这种需求,这会容易得多。
  • @SteveChamaillard 我这样做只是因为我对 sql 查询和 Laravel 缺乏经验。我将如何进行 sql 查询?如果你不介意解释:)

标签: mysql laravel eloquent


【解决方案1】:

您可以使用Collection::groupBy,它将按指定字段的每个值对元素进行分组,因此您将在属于该年份的记录中为每一年创建一个子数组。
你只需要先collect()你得到什么来创建一个集合,然后调用->groupBy('year')。

【讨论】:

  • 这不起作用,我认为是因为它不返回集合?我收到错误:未定义的索引:年份。但我试过 collect($posts_by_date)->groupBy('year')->toArray();在初始代码下方并且有效!所以谢谢:)如果你编辑你的答案,我会接受!
  • 哦,太好了,这真的很奇怪,在文档 (laravel.com/api/5.7/Illuminate/Database/Eloquent/Relations/…) 上有 Collection 作为返回类型,但是我会编辑答案
猜你喜欢
  • 2016-05-18
  • 1970-01-01
  • 2017-03-24
  • 2012-07-31
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 2014-08-30
相关资源
最近更新 更多