Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 07.12.2017 19:00:51

Работа с датой

Доброго времени суток.
Есть таблица articles (id, name,...,status,timestamps)

Задача состоит в том что бы через определенное количество времени после того как article опубликован (скажем 2 часа), скрыть его, то есть сменить status.
Как такое можно реализовать на laravel? Заранее спасибо !!!

Не в сети

#2 07.12.2017 20:13:14

Re: Работа с датой

Создай команду, которая будет брать статьи со старым статусом и created_at старше двух часов и менять их статус на новый, например:

$this->articles->where('status', 0)->where('created_at', '<', now()->subHours(2))->update(['status' => 1]);

Запускай команду каждую минуту или пять минут с помощью планировщика задач.

Не в сети

#3 07.12.2017 21:46:01

Re: Работа с датой

Является ли описанный вами метод самым правильным или есть и другой способ ??? Спасибо!

Не в сети

#4 08.12.2017 08:17:12

Re: Работа с датой

Про другой способ тоже спросишь "является липравильным"? big_smile

Конечно сначала надо подумать, а нельзя ли вместо хранения статуса вычислять его. Дата-время публикации ты знаешь, текущее время тоже, MySQL и PHP умеют оперировать датами. Вместо "скрывать" поставь слово "не показывать" или "не получать из базы". Преимущества:
- в любой момент ты можешь поправить продолжительность периода показа и это сразу отразится на выдаче, без правки чего-то в базе
- даже если ты не настроил cron на вызов ларавельного шедулера, это будет работать
- после backup/restore ты видишь картину как она должны быть, а не какой она была когда-то давно.

На SQL это выглядит примерно так:

SELECT *
FROM articles
WHERE created_at > NOW() - INTERVAL 5 DAY

There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#5 08.12.2017 08:22:21

Re: Работа с датой

P.S. Это не значит, что изменять данные по расписанию "неправильно"! Просто ты спросил про другой способ — я его показал. Решай сам по обстоятельствам.

P.P.S. Задачу еще пожно решить через MySQL Events: https://dev.mysql.com/doc/refman/5.7/en … duler.html


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#6 08.12.2017 14:34:04

Re: Работа с датой

Спасибо большое за ответ, в принципе до того как вы ответили я использовал именно такой способ который вы описали в предыдущем сообщении.
Ещё раз благодарю за участие!

Не в сети

#7 09.12.2017 20:26:05

Re: Работа с датой

Еще один вариант - использовать очереди с задержкой:

Job::dispatch($model)->delay(now()->addHours(2));

Не в сети

Подвал раздела