[英]Laravel how to display content based on publish date
我的laravel
-application中有多個帖子,我想根據其發布日期顯示這些帖子。
因此,當我創建帖子時,我將發布日期設置為此格式2019-06-27 12:00:00
保存在2019-06-27 12:00:00
中的publishes_on
2019-06-27 12:00:00
中。
在我的刀片視圖中,我曾經這樣遍歷這些帖子:
@foreach($blogs as $blog)
<div>
<h1>{{ $blog->title }}</h1>
// etc. etc.
</div>
@endforeach
因此,當我將發布日期設置為2019-07-21 10:00:00
,直到發布日期過去,才應顯示該帖子。
我該如何實現?
取而代之的是,您獲取那些少於當前日期的博客,
Blog::where("publishes_on","<=",Carbon::now())->get();
您要過濾控制器中的帖子。 除非您打算在其他地方使用未發布的帖子,否則不要在視圖中過濾掉。
就像是:
$blogs = Blog::where('publishes_on', '<=', Carbon::now())->get();
您可以通過幾種不同的方法來執行此操作,最有效的方法是在數據庫級別。 您可以使查詢類似:
$blogs = Blog::where('publishes_on', '<=', now())->get()
如果您希望使用查詢范圍,也可以將其抽象出來。 為此,請在模型上添加以下方法。
public function scopePublished($builder)
{
$builder->where('publishes_on', '<=', now());
}
然后,您可以將其更改為:
$posts = Blog::published()->get()
這樣,您將傳遞給視圖的唯一帖子就是那些已發布的帖子。
第二個選項是比較視圖中的日期/時間。 例如:
@foreach($blogs as $blog)
@if(\Carbon\Carbon::parse($blog->publishes_on)->gte(now()))
<div>
<h1>{{ $blog->title }}</h1>
// etc. etc.
</div>
@endif
@endforeach
但是,這種方式不會表現出色。 這是因為您正在比較PHP端每次迭代的日期和時間。 您顯示的帖子越多,頁面加載所需的時間就越長。
最好在數據庫級別執行此操作。 僅使用where子句就可以了,但是查詢范圍可以使其更具可讀性。
我希望這有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.