2017-06-02 59 views
0

请帮助。我正在制作一个在特定日期和时间首次亮相的网站。教程正在每个教师的日期上显示给每个学生。不过,我希望这些教程不仅可以在每个教程中设置的日期和时间进行初次亮相,还可以基于每个教程中设置的时区。例如,如果教程将于美国东部标准时间(东部标准时间)的美国东部标准时间(美国东部标准时间)晚上8点正式亮相,那么它应该在当时首次亮相,而不是在应用程序设置的时区开始亮相。根据教程日期和Laravel中的指定时区显示教程

我写了下面的代码使用Laravel收集过滤器()似乎做的伎俩。但是,该页面加载时间较长,我无法使用laravel paginate()。我需要使用Laravel paginate()来减少一次拉动的记录数量。有超过四千个教程。请帮忙。

// upcoming tutorials 
$tutorials = Tutorial::orderBy('id', 'desc)->paginate(20); 
$futureTuts = $tutorials->filter(function ($value, $key) { 
    $today = new \DateTime('now'); 
    $show_date = new \DateTime($value->show_date, new \DateTimeZone($value->timezones->name)); 
    return $show_date > $today; 
}); 

$upcoming_tuts = $futureTuts->all(); 

请任何解决方案,以便能够使用Laravel默认paginate()。我相信使用Laravel分页会使页面加载速度更快。我正在使用Laravel 5.4。

感谢

+0

我实在无法理解你的语言,但似乎我可以帮你,我给你2建议作为答案 –

+0

@ SID-心脏,怎么能我整合,以便检查每个教程中设置的时区?现在,它只是比较今天的日期和已发布的日期。我们想要做的是检查Carbon :: now()是否等于published_at时间和时区。 –

回答

0

尝试使用数据表可以从数据库API 过滤数据,这里是包 yajra/laravel-数据表甲骨文 ,如果你想公布尝试不同的东西这样 添加使用作为published_at列

$table->dateTime('published_at'); 

比你的模型定义表

protected $dates = ['published_at']; 

    public function setPublishedAtAttribute($date){ 

     $this->attributes['published_at'] = Carbon::createFromFormat('Y-m-d', $date); 
    } 

    public function scopePublished($query) 
    { 
     $query->where('published_at', '<=', Carbon::now()); 
    } 

    public function scopeUnpublished($query) 
    { 
     $query->where('published_at', '>', Carbon::now()); 
    } 

    public function getCreatedAtAttribute($date) 
    { 
     return $this->asDateTime($date)->toFormattedDateString(); 
    } 

现在你可以使用发布范围在控制器这样

$tutorials = Tutorial::orderBy('created_at', 'desc')->published()->paginate(5); 
+0

如何整合时区,以便该方法还可以检查每个教程中设置的时区?现在,它只是比较今天的日期和已发布的日期。我们想要做的是根据时间和时区来检查publish_at是否大于Carbon :: now()。 –

+0

其工作自动碳类与处理此 –

+0

每个教程的时区字段是与published_at日期字段不同。这就是我问的原因。 –