Сравнивая дату с Carbon - PullRequest
0 голосов
/ 17 мая 2018

Я использую 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'
];

Этомоя таблица базы данных:

enter image description here

Но, на мой взгляд, я получаю это:

enter image description here

Я неправильно использую Carbon?

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Я думаю, что проблема возникает с 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(). Надеюсь, это поможет вам.

0 голосов
/ 17 мая 2018

Я не уверен на 100%, если необходимо установить тип в БД на DATE вместо VARCHAR.

Я просто предположу, что он работает и с VARCHAR.Это будет означать, что, установив в модели массив $dates, ваша коллекция автоматически создаст экземпляр Carbon с уже существующим значением.

С:

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

Вы уже анализируетесуществующий экземпляр Carbon.

Попробуйте вместо:

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