subDays(config('rooms.guest_retention_days')); $accountCutoff = $closedAt->subDays(config('rooms.account_retention_days')); Room::query() ->whereNull('closed_at') ->where(function ($query) use ($guestCutoff, $accountCutoff): void { $query ->where(function ($query) use ($guestCutoff): void { $query->whereNull('owner_id') ->where('last_activity_at', '<=', $guestCutoff); }) ->orWhere(function ($query) use ($accountCutoff): void { $query->whereNotNull('owner_id') ->where('last_activity_at', '<=', $accountCutoff); }); }) ->select('id') ->chunkById(100, function ($rooms) use ($closedAt, $guestCutoff, $accountCutoff): void { Room::query() ->whereKey($rooms->pluck('id')) ->whereNull('closed_at') ->where(function ($query) use ($guestCutoff, $accountCutoff): void { $query ->where(function ($query) use ($guestCutoff): void { $query->whereNull('owner_id') ->where('last_activity_at', '<=', $guestCutoff); }) ->orWhere(function ($query) use ($accountCutoff): void { $query->whereNotNull('owner_id') ->where('last_activity_at', '<=', $accountCutoff); }); }) ->update([ 'closed_at' => $closedAt, 'state_version' => DB::raw('state_version + 1'), 'updated_at' => $closedAt, ]); }, 'id'); } }