Laravel碳组按时间段划分

时间:2016-09-12 17:04:48

标签: php laravel php-carbon

我正在尝试使用Laravel进行存档,我可以存储书面文章。我希望它有一个像这样的结构:

 - Today
   - Article 1
 - This week
   - Article 2
   - article 3
 - This month
   - Article 4
 - This year
   - Article 4

当没有文章时,例如“今天”,标题“今天”未显示。任何其他类别相同。

我设法制作了一个档案,我可以在这里存储特定格式的文章,例如每年:

$archives = Article::all()->groupBy(function($date) {
      return Carbon::parse($date->created_at)->format('Y');
});

As-is

但是我可以通过对现有代码或其他代码进行一些更改来实现上面列出的列表吗?

1 个答案:

答案 0 :(得分:0)

我认为使用MySQL,我们可以使它相当优雅(尽管它确实需要DB::raw())。此外,它很容易进行更改。

$groupSelect =
"CASE
    WHEN DAYOFYEAR(created_at) = DAYOFYEAR(CURDATE()) THEN 'Today'
    WHEN WEEKOFYEAR(created_at) = WEEKOFYEAR(CURDATE()) THEN 'This Week'
    WHEN DATE_FORMAT(created_at, '%Y-%m') = DATE_FORMAT(CURDATE(), '%Y-%m') THEN 'This Month'
    WHEN YEAR(created_at) = YEAR(CURDATE()) THEN 'This Year'
    ELSE 'Super Duper Long Time Ago'
END AS theGroup";

$archives = Article::select('*')->addSelect(DB::raw($groupSelect))->get()->groupBy(function($article) {
    return $article->theGroup;
});

如果您不喜欢原始SQL,则可以向Article模型添加一个函数,该函数将读取日期并确定它是今天,本周,本月还是今年并返回该字符串。 ..

public function getDiffForArchive()
{
    if ( strtotime($this->attributes['created_at']) > strtotime('-1 day')) {
        return 'Today';
    } else if (...) {  // Continue on with above logic.
        return '...';
    }
}

然后在你的回调中它就像......一样简单。

return $article->getDiffForArchive();

修改

我已经更新了SQL,因为我认为它接近你想要的,并且还需要在查询构建器上以select('*)开头,否则它只会选择theGroup。它现在有效,我已经测试过了。