首页 > 解决方案 > 将日期与 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()大于。

在我的过滤器中,我抓住了开始日期并将其与它进行了比较,Carbon::now()但由于某种原因,它没有返回我所期望的。

在我的数据库startDate中是一个VARCHAR,但在我的事件模型中,我指定了以下内容:

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

这是我的数据库表:

在此处输入图像描述

但在我看来,我明白了:

在此处输入图像描述

我用Carbon错了吗?

标签: phplaravellaravel-5php-carbon

解决方案


我不是 100% 确定是否有必要将 DB 中的类型设置为DATE而不是VARCHAR.

我只是假设它也适用于VARCHAR。这意味着通过$dates在模型中设置数组,您的集合将自动创建该值的 Carbon 实例。

和:

return Carbon::parse($events->startDate)->gt($today);

您正在解析一个已经存在的 Carbon 实例。

请尝试:

return $events->startDate->gt($today);

推荐阅读