请帮忙。我正在一个在特定日期和时间首次亮相的网站上工作。每个教程都会在每个学生的日期上显示教程。但是,我希望这些教程不仅可以通过每个教程设置的日期和时间进行首次亮相,还可以根据每个教程设置的时区进行首次亮相。例如,如果教程设置为今天美国东部标准时间(美国东部标准时间)晚上8点首次亮相,那么它应该在那时首次亮相而不是在应用程序设置时区首次亮相。
我使用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 :(得分:0)
尝试使用datatable可以将数据从数据库中过滤为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);