Истекайте строки в конце дня с Eloquent и Carbon в Laravel - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть работа, которая должна закрыться в конце даты, указанной в столбце expires_on.

Таким образом, если срок действия истекает 05/11/2018, срок действия задания истекает в 11:59 этой даты.

Мой текущий запрос:

$job_posts = JobPost::where('expires_on', '<', Carbon::now())
    ->where('status', '<>', 'Closed')
    ->get();

Однако этот запрос закрывает задание в полночь (00:00), так как это фактически начало этого дня, я бы предпочел, чтобы оно закрылось в конце указанной даты, а не в начале.

Было бы правильнее сделать это:

$job_posts = JobPost::where('expires_on', '<', Carbon::now())
    ->addDay(1))
    ->where('status', '<>', 'Closed')
    ->get();

Или это:

$job_posts = JobPost::where('expires_on', '<', Carbon::now())
    ->endOfDay())
    ->where('status', '<>', 'Closed')
    ->get();

Обновление

Я изменил поле expires_on на datetime поле, и в моей модели, которая ссылается на вакансии, я создал мутатор, который всегда устанавливает время закрытия 23:59:59, например:

/**
 * Set the expiry date to always be 11:59PM on the given day
 *
 * @param string $value
 * @return void
 */
public function setExpiresOnAttribute($value)
{
    $this->attributes['expires_on'] = Carbon::parse($value)->endOfDay();
}

Это означает, что мой оригинальный код должен, теоретически, выполнять работу, так как время окончания работы больше не полночь (00:00:00)

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Используйте функцию setTimeFromTimeString, чтобы добавить указанное время к now:

См. Результат функции:

dd([Carbon::now(), Carbon::now()->setTimeFromTimeString("23:59")]);

Вывод:

Carbon @1541421688 {#1418 ▼
  date: 2018-11-05 16:11:28.810618 Asia/Tehran (+03:30)
}
Carbon @1541449740 {#1420 ▼
  date: 2018-11-05 23:59:00.0 Asia/Tehran (+03:30)
}

Итак, в своем запросе вы можете использовать эту функцию, как показано ниже:

$job_posts = JobPost::where('expires_on', '<', Carbon::now()->setTimeFromTimeString("23:59"))
    ->where('status', '<>', 'Closed')
    ->get();
0 голосов
/ 05 ноября 2018

Проверьте, меньше ли дата, чем «завтра»:

$job_posts = JobPost::where('expires_on','<', Carbon::tomorrow())
    ->where('status', '<>', 'Closed')
    ->get();

Меньше, чем завтра, на самом деле, последняя секунда и меньше вчерашнего дня. Что точно так же, как ваши два последних примера.

...