将日期与碳

时间:2018-05-17 10:55:08

标签: php laravel laravel-5 php-carbon

我正在使用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()进行了比较,但出于某种原因,它并未返回我期望的结果。

在我的数据库中startDateVARCHAR,但在我的活动模型中,我指定了以下内容:

protected $dates = [
    'startDate', 'finishDate'
];

这是我的数据库表:

enter image description here

但在我看来,我得到了这个:

enter image description here

我错误地使用Carbon吗?

2 个答案:

答案 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()进行比较的真实日期。希望这会对你有所帮助。