Laravel如何根据发布日期显示内容

时间:2019-06-27 08:53:51

标签: php laravel

我的laravel-应用程序中有多个帖子,我想根据它们的发布日期显示这些帖子。

因此,当我创建帖子时,我将发布日期设置为以2019-06-27 12:00:00格式保存在数据库的publishes_on列中。

在我的刀片视图中,我以前经常在这样的帖子中循环浏览:

@foreach($blogs as $blog)
  <div>
      <h1>{{ $blog->title }}</h1>
      // etc. etc.
  </div>
@endforeach

因此,例如,当我将发布日期设置为2019-07-21 10:00:00时,直到发布日期过去才显示该帖子。

我该如何实现?

3 个答案:

答案 0 :(得分:1)

取而代之的是,您获取那些少于当前日期的博客,

Blog::where("publishes_on","<=",Carbon::now())->get();

答案 1 :(得分:1)

您要过滤控制器中的帖子。 除非您打算在其他地方使用未发布的帖子,否则请不要在视图中过滤掉。

类似的东西:

INT

答案 2 :(得分:1)

您可以通过两种不同的方法来执行此操作,最有效的方法是在数据库级别。您可以使查询类似:

$blogs = Blog::where('publishes_on', '<=', now())->get()

如果您希望使用查询范围,也可以将其抽象出来。为此,请在模型上添加以下方法。

public function scopePublished($builder)
{
    $builder->where('publishes_on', '<=', now());
}

然后,您可以将其更改为:

$posts = Blog::published()->get()

这样,您传递给视图的唯一帖子就是发布的帖子。

选项2

第二个选项是比较视图中的日期/时间。例如:

@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子句就可以了,但是查询范围可以使其更具可读性。

我希望这会有所帮助。