我正在使用Laravel Scout搜索模型,然后我使用过滤器来获取过去的事件和即将发生的事件。
这是我的方法:
public function search(Request $request)
{
$search = $request->get('q');
// Laravel Scout search() method
$users = User::search($search)->get();
$articles = Article::search($search)->get();
$events = Event::search($search)->get();
$today = Carbon::now();
$upcomingEvents = $events->filter(function ($events) use ($today) {
return Carbon::parse($events->startDate)->gt($today);
});
$pastEvents = $events->filter(function ($events) use ($today) {
return Carbon::parse($events->startDate)->lt($today);
});
$userCount = count($users);
$articleCount = count($articles);
$eventCount = count($events);
$upcomingEventCount = count($upcomingEvents);
$pastEventCount = count($pastEvents);
$templateCount = 0;
return view('pages.search.index', compact('search', 'users', 'articles', 'upcomingEvents', 'pastEvents', 'userCount', 'articleCount', 'upcomingEventCount', 'pastEventCount', 'templateCount'));
}
我在这里阅读了一个教程:https://scotch.io/tutorials/easier-datetime-in-laravel-and-php-with-carbon
读到这篇文章,我看到你现在可以通过Carbon::now()
获得今天。
还有lt()
小于gt()
小于。{/ p>
在我的过滤器中,我抓住了开始日期并将其与Carbon::now()
进行了比较,但出于某种原因,它并未返回我期望的结果。
在我的数据库中startDate
是VARCHAR
,但在我的活动模型中,我指定了以下内容:
protected $dates = [
'startDate', 'finishDate'
];
这是我的数据库表:
但在我看来,我得到了这个:
我错误地使用Carbon
吗?
答案 0 :(得分:1)
我不是100%确定是否需要将数据库中的类型设置为DATE
而不是VARCHAR
。
我将假设它也适用于VARCHAR
。这意味着通过在模型中设置$dates
数组,您的集合将自动创建值的Carbon实例。
使用:
return Carbon::parse($events->startDate)->gt($today);
您正在解析已经存在的Carbon实例。
尝试改为:
return $events->startDate->gt($today);
答案 1 :(得分:0)
我认为问题发生在startDate
VARCHAR
。您可以使用以下简单方法将其转换为实际日期:
private function convertDateString($date)
{
if (is_string($date)) {
$date = Carbon::parse($date,new DateTimeZone('YOUR_DATE_TIME_ZONE'));
}
return $date;
}
您可以将startDate
值传递给in并获得与Carbon::now()
进行比较的真实日期。希望这会对你有所帮助。