簡體   English   中英

Laravel碳時期分組

[英]Laravel carbon group by time period

我正在嘗試與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');
});

原樣

但是是否可以通過更改現有代碼或其他代碼來獲得我上面給出的列表?

我認為使用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 現在它可以工作了,我已經測試過了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM