Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Доброго времени суток.
Есть таблица articles (id, name,...,status,timestamps)
Задача состоит в том что бы через определенное количество времени после того как article опубликован (скажем 2 часа), скрыть его, то есть сменить status.
Как такое можно реализовать на laravel? Заранее спасибо !!!
Не в сети
Создай команду, которая будет брать статьи со старым статусом и created_at старше двух часов и менять их статус на новый, например:
$this->articles->where('status', 0)->where('created_at', '<', now()->subHours(2))->update(['status' => 1]);
Запускай команду каждую минуту или пять минут с помощью планировщика задач.
Не в сети
Является ли описанный вами метод самым правильным или есть и другой способ ??? Спасибо!
Не в сети
Про другой способ тоже спросишь "является липравильным"?
Конечно сначала надо подумать, а нельзя ли вместо хранения статуса вычислять его. Дата-время публикации ты знаешь, текущее время тоже, 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.
Не в сети
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.
Не в сети
Спасибо большое за ответ, в принципе до того как вы ответили я использовал именно такой способ который вы описали в предыдущем сообщении.
Ещё раз благодарю за участие!
Не в сети
Еще один вариант - использовать очереди с задержкой:
Job::dispatch($model)->delay(now()->addHours(2));
Не в сети
Страницы 1