@Djonson86
Нечем похвастаться.

Как поменять поле, которое проверяется в условии ларавель?

Добрый день. Такая проблема. Проверяю активных юзеров, и если он не обновлялся больше трех месяцев, хочу сделать его архивным, меняя active на 0. Сделал такое условие с методом. Проверяю запуском сидера.
$users = User::where('active', 1)->whereDate('updated_at', '<=', date('Y-m-d H:i:s', strtotime('-90 days')))->get();
        if (!empty($users)) {
            foreach ($users as $user) {
                if (!empty($user)) {
                    if ($user->active == 1) {
                        $user->active = 0;
                        $user->save();
                    }
                }
            }
        }

При запуске этого сидера, если выполняется условие, его зацикливает, или еще чего. Висит он короче, помогает Ctrl+C. При этом первую подходящую запись в таблице он все таки обновляет. Если пробовать изменить другое поле, не active, все работает как задумано. Пробовал без всех этих ифов, только форич, тоже самое. В чем прикол и как исправить?
  • Вопрос задан
  • 138 просмотров
Решения вопроса 1
@jazzus
\DB::table('users')
   ->where('active', true)
   ->whereDate('updated_at', '<=', now()->subMonths(3))
   ->update(['active' => false]);
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Alex_Wells
@Alex_Wells
PHP/Kotlin
Зачем тебе active в принципе? Почему ты в выборках не можешь просто юзать updated_at где тебе нужно? Судя по тому, что ты задаешь этот вопрос, никаких причин нет.
Ответ написан
glaphire
@glaphire
PHP developer
До дебага сначала стоит отрефакторить код) чтобы уменьшить цикломатическую сложность и увеличить читаемость:
$lastActiveDate = date('Y-m-d H:i:s', strtotime('-90 days'));

$users = User::where('active', 1)
    ->whereDate('updated_at', '<=', $lastActiveDate)
    ->get();

if ($users->isEmpty()) {
    return;
}

foreach ($users as $user) {
    if ($user->isEmpty()) {
        continue;
    }
    
    if ($user->active == 1) {
        $user->active = 0;
        $user->save();
    }  
}

Я не помню точно, но обычная функция empty не будет работать на коллекцию $users, на $user в форыче возможно
UPD. Вообще-то юзеры c is_active=1 уже отобраны в запросе, поэтому форыч можно свести к:
foreach ($users as $user) {
    $user->active = 0;
    $user->save();
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы